diff --git a/Texassemble/Texassemble_Desktop_2010.sln b/Texassemble/Texassemble_Desktop_2010.sln
new file mode 100644
index 0000000..37f35f9
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2010.sln
@@ -0,0 +1,45 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8F18CBD7-4116-4956-BCD8-20D688A4CBD1}") = "texassemble", "Texassemble_Desktop_2010.vcxproj", "{C3A65381-8FD3-4F69-B29E-654B4B0ED136}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTex", "..\DirectXTex\DirectXTex_Desktop_2010.vcxproj", "{371B9FA9-4C90-4AC6-A123-ACED756D6C77}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Profile|Win32 = Profile|Win32
+ Profile|x64 = Profile|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Debug|Win32.Build.0 = Debug|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Debug|x64.ActiveCfg = Debug|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Debug|x64.Build.0 = Debug|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Profile|Win32.ActiveCfg = Profile|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Profile|Win32.Build.0 = Profile|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Profile|x64.ActiveCfg = Profile|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Profile|x64.Build.0 = Profile|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Release|Win32.ActiveCfg = Release|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Release|Win32.Build.0 = Release|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Release|x64.ActiveCfg = Release|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Release|x64.Build.0 = Release|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|Win32.ActiveCfg = Debug|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|Win32.Build.0 = Debug|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|x64.ActiveCfg = Debug|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|x64.Build.0 = Debug|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|Win32.ActiveCfg = Profile|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|Win32.Build.0 = Profile|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|x64.ActiveCfg = Profile|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|x64.Build.0 = Profile|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|Win32.ActiveCfg = Release|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|Win32.Build.0 = Release|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|x64.ActiveCfg = Release|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Texassemble/Texassemble_Desktop_2010.vcxproj b/Texassemble/Texassemble_Desktop_2010.vcxproj
new file mode 100644
index 0000000..a3c8a37
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2010.vcxproj
@@ -0,0 +1,382 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Profile
+ Win32
+
+
+ Profile
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ texassemble
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}
+ texassemble
+ Win32Proj
+
+
+
+ Application
+ Unicode
+
+
+ Application
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ $(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath)
+ $(DXSDK_DIR)Include;$(IncludePath)
+ $(DXSDK_DIR)Lib\x86;$(LibraryPath)
+
+
+ true
+ true
+ $(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath)
+ $(DXSDK_DIR)Include;$(IncludePath)
+ $(DXSDK_DIR)Lib\x64;$(LibraryPath)
+
+
+ false
+ true
+ $(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath)
+ $(DXSDK_DIR)Include;$(IncludePath)
+ $(DXSDK_DIR)Lib\x86;$(LibraryPath)
+
+
+ false
+ true
+ $(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath)
+ $(DXSDK_DIR)Include;$(IncludePath)
+ $(DXSDK_DIR)Lib\x64;$(LibraryPath)
+
+
+ false
+ true
+ $(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath)
+ $(DXSDK_DIR)Include;$(IncludePath)
+ $(DXSDK_DIR)Lib\x86;$(LibraryPath)
+
+
+ false
+ true
+ $(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86;$(ExecutablePath)
+ $(DXSDK_DIR)Include;$(IncludePath)
+ $(DXSDK_DIR)Lib\x64;$(LibraryPath)
+
+
+
+ Level4
+ Disabled
+ MultiThreadedDebugDLL
+ false
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\XNAMath;..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;USE_XNAMATH;%(PreprocessorDefinitions)
+ EditAndContinue
+ EnableFastChecks
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ Console
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ Disabled
+ MultiThreadedDebugDLL
+ false
+ true
+ Fast
+ Sync
+ ..\XNAMath;..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;USE_XNAMATH;%(PreprocessorDefinitions)
+ EnableFastChecks
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ Console
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\XNAMath;..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;USE_XNAMATH;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ Sync
+ ..\XNAMath;..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;USE_XNAMATH;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\XNAMath;..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;USE_XNAMATH;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ Sync
+ ..\XNAMath;..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;USE_XNAMATH;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {371b9fa9-4c90-4ac6-a123-aced756d6c77}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Texassemble/Texassemble_Desktop_2010.vcxproj.filters b/Texassemble/Texassemble_Desktop_2010.vcxproj.filters
new file mode 100644
index 0000000..71d78bd
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2010.vcxproj.filters
@@ -0,0 +1,17 @@
+
+
+
+
+ {8e114980-c1a3-4ada-ad7c-83caadf5daeb}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe
+
+
+
+
+
+
+
+ Resource Files
+
+
+
\ No newline at end of file
diff --git a/Texassemble/Texassemble_Desktop_2010_SDK80.sln b/Texassemble/Texassemble_Desktop_2010_SDK80.sln
new file mode 100644
index 0000000..b4cd942
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2010_SDK80.sln
@@ -0,0 +1,45 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8F18CBD7-4116-4956-BCD8-20D688A4CBD1}") = "texassemble", "Texassemble_Desktop_2010_SDK80.vcxproj", "{C3A65381-8FD3-4F69-B29E-654B4B0ED136}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTex", "..\DirectXTex\DirectXTex_Desktop_2010_SDK80.vcxproj", "{371B9FA9-4C90-4AC6-A123-ACED756D6C77}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Profile|Win32 = Profile|Win32
+ Profile|x64 = Profile|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Debug|Win32.Build.0 = Debug|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Debug|x64.ActiveCfg = Debug|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Debug|x64.Build.0 = Debug|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Profile|Win32.ActiveCfg = Profile|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Profile|Win32.Build.0 = Profile|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Profile|x64.ActiveCfg = Profile|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Profile|x64.Build.0 = Profile|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Release|Win32.ActiveCfg = Release|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Release|Win32.Build.0 = Release|Win32
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Release|x64.ActiveCfg = Release|x64
+ {C3A65381-8FD3-4F69-B29E-654B4B0ED136}.Release|x64.Build.0 = Release|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|Win32.ActiveCfg = Debug|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|Win32.Build.0 = Debug|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|x64.ActiveCfg = Debug|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|x64.Build.0 = Debug|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|Win32.ActiveCfg = Profile|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|Win32.Build.0 = Profile|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|x64.ActiveCfg = Profile|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|x64.Build.0 = Profile|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|Win32.ActiveCfg = Release|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|Win32.Build.0 = Release|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|x64.ActiveCfg = Release|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Texassemble/Texassemble_Desktop_2010_SDK80.vcxproj b/Texassemble/Texassemble_Desktop_2010_SDK80.vcxproj
new file mode 100644
index 0000000..d5cae5f
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2010_SDK80.vcxproj
@@ -0,0 +1,370 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Profile
+ Win32
+
+
+ Profile
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ texassemble
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}
+ texassemble
+ Win32Proj
+
+
+
+ Application
+ Unicode
+
+
+ Application
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+ Application
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+ true
+ true
+
+
+ false
+ true
+
+
+ false
+ true
+
+
+ false
+ true
+
+
+ false
+ true
+
+
+
+ Level4
+ Disabled
+ MultiThreadedDebugDLL
+ false
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+ EditAndContinue
+ EnableFastChecks
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ Console
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ Disabled
+ MultiThreadedDebugDLL
+ false
+ true
+ Fast
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+ EnableFastChecks
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ Console
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {371b9fa9-4c90-4ac6-a123-aced756d6c77}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Texassemble/Texassemble_Desktop_2010_SDK80.vcxproj.filters b/Texassemble/Texassemble_Desktop_2010_SDK80.vcxproj.filters
new file mode 100644
index 0000000..71d78bd
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2010_SDK80.vcxproj.filters
@@ -0,0 +1,17 @@
+
+
+
+
+ {8e114980-c1a3-4ada-ad7c-83caadf5daeb}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe
+
+
+
+
+
+
+
+ Resource Files
+
+
+
\ No newline at end of file
diff --git a/Texassemble/Texassemble_Desktop_2012.sln b/Texassemble/Texassemble_Desktop_2012.sln
new file mode 100644
index 0000000..1ea65f2
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2012.sln
@@ -0,0 +1,45 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "texassemble", "Texassemble_Desktop_2012.vcxproj", "{8F18CBD7-4116-4956-BCD8-20D688A4CBD1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTex", "..\DirectXTex\DirectXTex_Desktop_2012.vcxproj", "{371B9FA9-4C90-4AC6-A123-ACED756D6C77}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Profile|Win32 = Profile|Win32
+ Profile|x64 = Profile|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Debug|Win32.Build.0 = Debug|Win32
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Debug|x64.ActiveCfg = Debug|x64
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Debug|x64.Build.0 = Debug|x64
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Profile|Win32.ActiveCfg = Profile|Win32
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Profile|Win32.Build.0 = Profile|Win32
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Profile|x64.ActiveCfg = Profile|x64
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Profile|x64.Build.0 = Profile|x64
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Release|Win32.ActiveCfg = Release|Win32
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Release|Win32.Build.0 = Release|Win32
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Release|x64.ActiveCfg = Release|x64
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}.Release|x64.Build.0 = Release|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|Win32.ActiveCfg = Debug|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|Win32.Build.0 = Debug|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|x64.ActiveCfg = Debug|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Debug|x64.Build.0 = Debug|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|Win32.ActiveCfg = Profile|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|Win32.Build.0 = Profile|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|x64.ActiveCfg = Profile|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Profile|x64.Build.0 = Profile|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|Win32.ActiveCfg = Release|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|Win32.Build.0 = Release|Win32
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|x64.ActiveCfg = Release|x64
+ {371B9FA9-4C90-4AC6-A123-ACED756D6C77}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Texassemble/Texassemble_Desktop_2012.vcxproj b/Texassemble/Texassemble_Desktop_2012.vcxproj
new file mode 100644
index 0000000..97e5ad2
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2012.vcxproj
@@ -0,0 +1,389 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Profile
+ Win32
+
+
+ Profile
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ texassemble
+ {8F18CBD7-4116-4956-BCD8-20D688A4CBD1}
+ texassemble
+ Win32Proj
+ $(VCTargetsPath11)
+
+
+
+ Application
+ Unicode
+ v110
+
+
+ Application
+ Unicode
+ v110
+
+
+ Application
+ true
+ Unicode
+ v110
+
+
+ Application
+ true
+ Unicode
+ v110
+
+
+ Application
+ true
+ Unicode
+ v110
+
+
+ Application
+ true
+ Unicode
+ v110
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ $(ExecutablePath)
+ $(IncludePath)
+ $(LibraryPath)
+
+
+ true
+ true
+ $(ExecutablePath)
+ $(IncludePath)
+ $(LibraryPath)
+
+
+ false
+ true
+ $(ExecutablePath)
+ $(IncludePath)
+ $(LibraryPath)
+
+
+ false
+ true
+ $(ExecutablePath)
+ $(IncludePath)
+ $(LibraryPath)
+
+
+ false
+ true
+ $(ExecutablePath)
+ $(IncludePath)
+ $(LibraryPath)
+
+
+ false
+ true
+ $(ExecutablePath)
+ $(IncludePath)
+ $(LibraryPath)
+
+
+
+ Level4
+ Disabled
+ MultiThreadedDebugDLL
+ false
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+ EditAndContinue
+ EnableFastChecks
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ Console
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ Disabled
+ MultiThreadedDebugDLL
+ false
+ true
+ Fast
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;_DEBUG;DEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+ EnableFastChecks
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ Console
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ StreamingSIMDExtensions2
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX86
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ Level4
+ MaxSpeed
+ MultiThreadedDLL
+ false
+ true
+ true
+ Fast
+ Sync
+ ..\DirectXTex;%(AdditionalIncludeDirectories)
+ %(AdditionalOptions)
+ WIN32;NDEBUG;PROFILE;_CONSOLE;D3DXFX_LARGEADDRESS_HANDLE;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions)
+
+
+ %(AdditionalOptions)
+ ole32.lib;windowscodecs.lib;uuid.lib;%(AdditionalDependencies)
+ true
+ Console
+ true
+ true
+ true
+ true
+ true
+ MachineX64
+ AsInvoker
+ %(DelayLoadDLLs)
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {371b9fa9-4c90-4ac6-a123-aced756d6c77}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Texassemble/Texassemble_Desktop_2012.vcxproj.filters b/Texassemble/Texassemble_Desktop_2012.vcxproj.filters
new file mode 100644
index 0000000..71d78bd
--- /dev/null
+++ b/Texassemble/Texassemble_Desktop_2012.vcxproj.filters
@@ -0,0 +1,17 @@
+
+
+
+
+ {8e114980-c1a3-4ada-ad7c-83caadf5daeb}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe
+
+
+
+
+
+
+
+ Resource Files
+
+
+
\ No newline at end of file
diff --git a/Texassemble/directx.ico b/Texassemble/directx.ico
new file mode 100644
index 0000000..bc43c1b
Binary files /dev/null and b/Texassemble/directx.ico differ
diff --git a/Texassemble/texassemble.cpp b/Texassemble/texassemble.cpp
new file mode 100644
index 0000000..5d3220f
--- /dev/null
+++ b/Texassemble/texassemble.cpp
@@ -0,0 +1,756 @@
+//--------------------------------------------------------------------------------------
+// File: Texassemble.cpp
+//
+// DirectX 11 Texture assembler for cube maps, volume maps, and arrays
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//--------------------------------------------------------------------------------------
+
+#include
+#include
+#include
+
+#include
+
+#include "directxtex.h"
+
+#include
+
+using namespace DirectX;
+
+enum OPTIONS // Note: dwOptions below assumes 32 or less options.
+{
+ OPT_CUBE = 1,
+ OPT_VOLUME,
+ OPT_ARRAY,
+ OPT_CUBEARRAY,
+ OPT_FORMAT,
+ OPT_FILTER,
+ OPT_OUTPUTFILE,
+ OPT_USE_DX10,
+ OPT_NOLOGO,
+ OPT_SEPALPHA,
+};
+
+struct SConversion
+{
+ WCHAR szSrc [MAX_PATH];
+
+ SConversion *pNext;
+};
+
+struct SValue
+{
+ LPCWSTR pName;
+ DWORD dwValue;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+SValue g_pOptions[] =
+{
+ { L"cube", OPT_CUBE },
+ { L"volume", OPT_VOLUME },
+ { L"array", OPT_ARRAY },
+ { L"cubearray", OPT_CUBEARRAY },
+ { L"f", OPT_FORMAT },
+ { L"if", OPT_FILTER },
+ { L"o", OPT_OUTPUTFILE },
+ { L"dx10", OPT_USE_DX10 },
+ { L"nologo", OPT_NOLOGO },
+ { L"sepalpha", OPT_SEPALPHA },
+ { nullptr, 0 }
+};
+
+#define DEFFMT(fmt) { L#fmt, DXGI_FORMAT_ ## fmt }
+
+SValue g_pFormats[] =
+{
+ // List does not include _TYPELESS or depth/stencil formats
+ DEFFMT(R32G32B32A32_FLOAT),
+ DEFFMT(R32G32B32A32_UINT),
+ DEFFMT(R32G32B32A32_SINT),
+ DEFFMT(R32G32B32_FLOAT),
+ DEFFMT(R32G32B32_UINT),
+ DEFFMT(R32G32B32_SINT),
+ DEFFMT(R16G16B16A16_FLOAT),
+ DEFFMT(R16G16B16A16_UNORM),
+ DEFFMT(R16G16B16A16_UINT),
+ DEFFMT(R16G16B16A16_SNORM),
+ DEFFMT(R16G16B16A16_SINT),
+ DEFFMT(R32G32_FLOAT),
+ DEFFMT(R32G32_UINT),
+ DEFFMT(R32G32_SINT),
+ DEFFMT(R10G10B10A2_UNORM),
+ DEFFMT(R10G10B10A2_UINT),
+ DEFFMT(R11G11B10_FLOAT),
+ DEFFMT(R8G8B8A8_UNORM),
+ DEFFMT(R8G8B8A8_UNORM_SRGB),
+ DEFFMT(R8G8B8A8_UINT),
+ DEFFMT(R8G8B8A8_SNORM),
+ DEFFMT(R8G8B8A8_SINT),
+ DEFFMT(R16G16_FLOAT),
+ DEFFMT(R16G16_UNORM),
+ DEFFMT(R16G16_UINT),
+ DEFFMT(R16G16_SNORM),
+ DEFFMT(R16G16_SINT),
+ DEFFMT(R32_FLOAT),
+ DEFFMT(R32_UINT),
+ DEFFMT(R32_SINT),
+ DEFFMT(R8G8_UNORM),
+ DEFFMT(R8G8_UINT),
+ DEFFMT(R8G8_SNORM),
+ DEFFMT(R8G8_SINT),
+ DEFFMT(R16_FLOAT),
+ DEFFMT(R16_UNORM),
+ DEFFMT(R16_UINT),
+ DEFFMT(R16_SNORM),
+ DEFFMT(R16_SINT),
+ DEFFMT(R8_UNORM),
+ DEFFMT(R8_UINT),
+ DEFFMT(R8_SNORM),
+ DEFFMT(R8_SINT),
+ DEFFMT(A8_UNORM),
+ //DEFFMT(R1_UNORM)
+ DEFFMT(R9G9B9E5_SHAREDEXP),
+ DEFFMT(R8G8_B8G8_UNORM),
+ DEFFMT(G8R8_G8B8_UNORM),
+ DEFFMT(BC1_UNORM),
+ DEFFMT(BC1_UNORM_SRGB),
+ DEFFMT(BC2_UNORM),
+ DEFFMT(BC2_UNORM_SRGB),
+ DEFFMT(BC3_UNORM),
+ DEFFMT(BC3_UNORM_SRGB),
+ DEFFMT(BC4_UNORM),
+ DEFFMT(BC4_SNORM),
+ DEFFMT(BC5_UNORM),
+ DEFFMT(BC5_SNORM),
+ DEFFMT(B5G6R5_UNORM),
+ DEFFMT(B5G5R5A1_UNORM),
+
+ // DXGI 1.1 formats
+ DEFFMT(B8G8R8A8_UNORM),
+ DEFFMT(B8G8R8X8_UNORM),
+ DEFFMT(R10G10B10_XR_BIAS_A2_UNORM),
+ DEFFMT(B8G8R8A8_UNORM_SRGB),
+ DEFFMT(B8G8R8X8_UNORM_SRGB),
+ DEFFMT(BC6H_UF16),
+ DEFFMT(BC6H_SF16),
+ DEFFMT(BC7_UNORM),
+ DEFFMT(BC7_UNORM_SRGB),
+
+#ifdef DXGI_1_2_FORMATS
+ // DXGI 1.2 formats
+ DEFFMT(B4G4R4A4_UNORM),
+#endif
+
+ { nullptr, DXGI_FORMAT_UNKNOWN }
+};
+
+SValue g_pFilters[] =
+{
+ { L"POINT", TEX_FILTER_POINT },
+ { L"LINEAR", TEX_FILTER_LINEAR },
+ { L"CUBIC", TEX_FILTER_CUBIC },
+ { L"FANT", TEX_FILTER_FANT },
+ { L"BOX", TEX_FILTER_BOX },
+ { L"TRIANGLE", TEX_FILTER_TRIANGLE },
+ { L"POINT_DITHER", TEX_FILTER_POINT | TEX_FILTER_DITHER },
+ { L"LINEAR_DITHER", TEX_FILTER_LINEAR | TEX_FILTER_DITHER },
+ { L"CUBIC_DITHER", TEX_FILTER_CUBIC | TEX_FILTER_DITHER },
+ { L"FANT_DITHER", TEX_FILTER_FANT | TEX_FILTER_DITHER },
+ { L"BOX_DITHER", TEX_FILTER_BOX | TEX_FILTER_DITHER },
+ { L"TRIANGLE_DITHER", TEX_FILTER_TRIANGLE | TEX_FILTER_DITHER },
+ { L"POINT_DITHER_DIFFUSION", TEX_FILTER_POINT | TEX_FILTER_DITHER_DIFFUSION },
+ { L"LINEAR_DITHER_DIFFUSION", TEX_FILTER_LINEAR | TEX_FILTER_DITHER_DIFFUSION },
+ { L"CUBIC_DITHER_DIFFUSION", TEX_FILTER_CUBIC | TEX_FILTER_DITHER_DIFFUSION },
+ { L"FANT_DITHER_DIFFUSION", TEX_FILTER_FANT | TEX_FILTER_DITHER_DIFFUSION },
+ { L"BOX_DITHER_DIFFUSION", TEX_FILTER_BOX | TEX_FILTER_DITHER_DIFFUSION },
+ { L"TRIANGLE_DITHER_DIFFUSION", TEX_FILTER_TRIANGLE | TEX_FILTER_DITHER_DIFFUSION },
+ { nullptr, TEX_FILTER_DEFAULT }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+#pragma prefast(disable : 26018, "Only used with static internal arrays")
+
+DWORD LookupByName(const WCHAR *pName, const SValue *pArray)
+{
+ while(pArray->pName)
+ {
+ if(!_wcsicmp(pName, pArray->pName))
+ return pArray->dwValue;
+
+ pArray++;
+ }
+
+ return 0;
+}
+
+const WCHAR* LookupByValue(DWORD pValue, const SValue *pArray)
+{
+ while(pArray->pName)
+ {
+ if(pValue == pArray->dwValue)
+ return pArray->pName;
+
+ pArray++;
+ }
+
+ return L"";
+}
+
+void PrintFormat(DXGI_FORMAT Format)
+{
+ for(SValue *pFormat = g_pFormats; pFormat->pName; pFormat++)
+ {
+ if((DXGI_FORMAT) pFormat->dwValue == Format)
+ {
+ wprintf( pFormat->pName );
+ break;
+ }
+ }
+}
+
+void PrintInfo( const TexMetadata& info )
+{
+ wprintf( L" (%Iux%Iu", info.width, info.height);
+
+ if ( TEX_DIMENSION_TEXTURE3D == info.dimension )
+ wprintf( L"x%Iu", info.depth);
+
+ if ( info.mipLevels > 1 )
+ wprintf( L",%Iu", info.mipLevels);
+
+ wprintf( L" ");
+ PrintFormat( info.format );
+
+ switch ( info.dimension )
+ {
+ case TEX_DIMENSION_TEXTURE1D:
+ wprintf( (info.arraySize > 1) ? L" 1DArray" : L" 1D" );
+ break;
+
+ case TEX_DIMENSION_TEXTURE2D:
+ if ( info.IsCubemap() )
+ {
+ wprintf( (info.arraySize > 6) ? L" CubeArray" : L" Cube" );
+ }
+ else
+ {
+ wprintf( (info.arraySize > 1) ? L" 2DArray" : L" 2D" );
+ }
+ break;
+
+ case TEX_DIMENSION_TEXTURE3D:
+ wprintf( L" 3D");
+ break;
+ }
+
+ wprintf( L")");
+}
+
+
+void PrintList(size_t cch, SValue *pValue)
+{
+ while(pValue->pName)
+ {
+ size_t cchName = wcslen(pValue->pName);
+
+ if(cch + cchName + 2>= 80)
+ {
+ wprintf( L"\n ");
+ cch = 6;
+ }
+
+ wprintf( L"%s ", pValue->pName );
+ cch += cchName + 2;
+ pValue++;
+ }
+
+ wprintf( L"\n");
+}
+
+
+void PrintLogo()
+{
+ wprintf( L"Microsoft (R) DirectX 11 Texture Assembler (DirectXTex version)\n");
+ wprintf( L"Copyright (C) Microsoft Corp. All rights reserved.\n");
+ wprintf( L"\n");
+}
+
+
+void PrintUsage()
+{
+ PrintLogo();
+
+ wprintf( L"Usage: texassemble [-cube | - volume | -array | -cubearray] \n");
+ wprintf( L"\n");
+ wprintf( L" -cube create cubemap\n");
+ wprintf( L" -volume create volume map\n");
+ wprintf( L" -array create texture array\n");
+ wprintf( L" -cubearray create cubemap array\n");
+ wprintf( L" -f format\n");
+ wprintf( L" -if image filtering\n");
+ wprintf( L" -o output filename\n");
+ wprintf( L" -sepalpha resize/generate mips alpha channel separately\n");
+ wprintf( L" from color channels\n");
+ wprintf( L" -dx10 Force use of 'DX10' extended header\n");
+ wprintf( L" -nologo suppress copyright message\n");
+
+ wprintf( L"\n");
+ wprintf( L" : ");
+ PrintList(13, g_pFormats);
+
+ wprintf( L"\n");
+ wprintf( L" : ");
+ PrintList(13, g_pFilters);
+}
+
+
+//--------------------------------------------------------------------------------------
+// Entry-point
+//--------------------------------------------------------------------------------------
+#pragma prefast(disable : 28198, "Command-line tool, frees all memory on exit")
+
+int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
+{
+ // Parameters and defaults
+ HRESULT hr;
+ INT nReturn;
+
+ DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN;
+ DWORD dwFilter = TEX_FILTER_DEFAULT;
+ DWORD dwFilterOpts = 0;
+
+ WCHAR szOutputFile[MAX_PATH] = { 0 };
+
+ // Initialize COM (needed for WIC)
+ if( FAILED( hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED) ) )
+ {
+ wprintf( L"Failed to initialize COM (%08X)\n", hr);
+ return 1;
+ }
+
+ // Process command line
+ DWORD dwOptions = 0;
+ SConversion *pConversion = nullptr;
+ SConversion **ppConversion = &pConversion;
+
+ size_t images = 0;
+
+ for(int iArg = 1; iArg < argc; iArg++)
+ {
+ PWSTR pArg = argv[iArg];
+
+ if(('-' == pArg[0]) || ('/' == pArg[0]))
+ {
+ pArg++;
+ PWSTR pValue;
+
+ for(pValue = pArg; *pValue && (':' != *pValue); pValue++);
+
+ if(*pValue)
+ *pValue++ = 0;
+
+ DWORD dwOption = LookupByName(pArg, g_pOptions);
+
+ if(!dwOption || (dwOptions & (1 << dwOption)))
+ {
+ PrintUsage();
+ return 1;
+ }
+
+ dwOptions |= 1 << dwOption;
+
+ if( (OPT_NOLOGO != dwOption) && (OPT_SEPALPHA != dwOption) && (OPT_USE_DX10 != dwOption)
+ && (OPT_CUBE != dwOption) && (OPT_VOLUME != dwOption) && (OPT_ARRAY != dwOption) && (OPT_CUBEARRAY != dwOption) )
+ {
+ if(!*pValue)
+ {
+ if((iArg + 1 >= argc))
+ {
+ PrintUsage();
+ return 1;
+ }
+
+ iArg++;
+ pValue = argv[iArg];
+ }
+ }
+
+ switch(dwOption)
+ {
+ case OPT_FORMAT:
+ format = (DXGI_FORMAT) LookupByName(pValue, g_pFormats);
+ if ( !format )
+ {
+ wprintf( L"Invalid value specified with -f (%s)\n", pValue);
+ return 1;
+ }
+ break;
+
+ case OPT_FILTER:
+ dwFilter = LookupByName(pValue, g_pFilters);
+ if ( !dwFilter )
+ {
+ wprintf( L"Invalid value specified with -if (%s)\n", pValue);
+ return 1;
+ }
+ break;
+
+ case OPT_SEPALPHA:
+ dwFilterOpts |= TEX_FILTER_SEPARATE_ALPHA;
+ break;
+
+ case OPT_OUTPUTFILE:
+ wcscpy_s(szOutputFile, MAX_PATH, pValue);
+ break;
+ }
+ }
+ else
+ {
+ SConversion *pConv = new SConversion;
+ if ( !pConv )
+ return 1;
+
+ wcscpy_s(pConv->szSrc, MAX_PATH, pArg);
+
+ pConv->pNext = nullptr;
+
+ *ppConversion = pConv;
+ ppConversion = &pConv->pNext;
+
+ ++images;
+ }
+ }
+
+ if( !pConversion || images < 2 )
+ {
+ wprintf( L"ERROR: Need at least 2 images to assemble\n\n");
+ PrintUsage();
+ return 0;
+ }
+
+ switch( dwOptions & ( (1 << OPT_CUBE) | (1 << OPT_VOLUME) | (1 << OPT_ARRAY) | (1 << OPT_CUBEARRAY) ) )
+ {
+ case (1 << OPT_VOLUME):
+ case (1 << OPT_ARRAY):
+ break;
+
+ case (1 << OPT_CUBE):
+ if ( images != 6 )
+ {
+ wprintf( L"ERROR: -cube requires six images to form the faces of the cubemap\n");
+ return 1;
+ }
+ break;
+
+ case (1 << OPT_CUBEARRAY):
+ if ( ( images < 6) || ( images % 6 ) != 0 )
+ {
+ wprintf( L"-cubearray requires a multiple of 6 images to form the faces of the cubemaps\n");
+ return 1;
+ }
+ break;
+
+ default:
+ wprintf( L"Must use one of: -cube, -volume, -array, or -cubearray\n\n" );
+ return 1;
+ }
+
+ if(~dwOptions & (1 << OPT_NOLOGO))
+ PrintLogo();
+
+ // Convert images
+ size_t width = 0;
+ size_t height = 0;
+
+ std::vector loadedImages;
+
+ for( SConversion *pConv = pConversion; pConv; pConv = pConv->pNext )
+ {
+ WCHAR ext[_MAX_EXT];
+ WCHAR fname[_MAX_FNAME];
+ _wsplitpath_s( pConv->szSrc, nullptr, 0, nullptr, 0, fname, _MAX_FNAME, ext, _MAX_EXT );
+
+ // Load source image
+ if( pConv != pConversion )
+ wprintf( L"\n");
+ else if ( !*szOutputFile )
+ {
+ if ( _wcsicmp( ext, L".dds" ) == 0 )
+ {
+ wprintf( L"ERROR: Need to specify output file via -o\n");
+ return 1;
+ }
+
+ _wmakepath_s( szOutputFile, nullptr, nullptr, fname, L".dds" );
+ }
+
+ wprintf( L"reading %s", pConv->szSrc );
+ fflush(stdout);
+
+ TexMetadata info;
+ ScratchImage *image = new ScratchImage;
+
+ if ( !image )
+ {
+ wprintf( L" ERROR: Memory allocation failed\n" );
+ goto LError;
+ }
+
+ if ( _wcsicmp( ext, L".dds" ) == 0 )
+ {
+ hr = LoadFromDDSFile( pConv->szSrc, DDS_FLAGS_NONE, &info, *image );
+ if ( FAILED(hr) )
+ {
+ wprintf( L" FAILED (%x)\n", hr);
+ return 1;
+ }
+
+ if ( info.arraySize > 1
+ || info.depth > 1
+ || info.mipLevels > 1
+ || info.IsCubemap() )
+ {
+ wprintf( L"ERROR: Can't assemble complex surfaces\n" );
+ return 1;
+ }
+ }
+ else if ( _wcsicmp( ext, L".tga" ) == 0 )
+ {
+ hr = LoadFromTGAFile( pConv->szSrc, &info, *image );
+ if ( FAILED(hr) )
+ {
+ wprintf( L" FAILED (%x)\n", hr);
+ return 1;
+ }
+ }
+ else
+ {
+ // WIC shares the same filter values for mode and dither
+ static_assert( WIC_FLAGS_DITHER == TEX_FILTER_DITHER, "WIC_FLAGS_* & TEX_FILTER_* should match" );
+ static_assert( WIC_FLAGS_DITHER_DIFFUSION == TEX_FILTER_DITHER_DIFFUSION, "WIC_FLAGS_* & TEX_FILTER_* should match" );
+ static_assert( WIC_FLAGS_FILTER_POINT == TEX_FILTER_POINT, "WIC_FLAGS_* & TEX_FILTER_* should match" );
+ static_assert( WIC_FLAGS_FILTER_LINEAR == TEX_FILTER_LINEAR, "WIC_FLAGS_* & TEX_FILTER_* should match" );
+ static_assert( WIC_FLAGS_FILTER_CUBIC == TEX_FILTER_CUBIC, "WIC_FLAGS_* & TEX_FILTER_* should match" );
+ static_assert( WIC_FLAGS_FILTER_FANT == TEX_FILTER_FANT, "WIC_FLAGS_* & TEX_FILTER_* should match" );
+
+ hr = LoadFromWICFile( pConv->szSrc, dwFilter, &info, *image );
+ if ( FAILED(hr) )
+ {
+ wprintf( L" FAILED (%x)\n", hr);
+ return 1;
+ }
+ }
+
+ PrintInfo( info );
+
+ // Convert texture
+ fflush(stdout);
+
+ // --- Decompress --------------------------------------------------------------
+ if ( IsCompressed( info.format ) )
+ {
+ const Image* img = image->GetImage(0,0,0);
+ assert( img );
+ size_t nimg = image->GetImageCount();
+
+ ScratchImage *timage = new ScratchImage;
+ if ( !timage )
+ {
+ wprintf( L" ERROR: Memory allocation failed\n" );
+ delete image;
+ goto LError;
+ }
+
+ hr = Decompress( img, nimg, info, DXGI_FORMAT_UNKNOWN /* picks good default */, *timage );
+ if ( FAILED(hr) )
+ {
+ wprintf( L" FAILED [decompress] (%x)\n", hr);
+ delete timage;
+ delete image;
+ continue;
+ }
+
+ const TexMetadata& tinfo = timage->GetMetadata();
+
+ info.format = tinfo.format;
+
+ assert( info.width == tinfo.width );
+ assert( info.height == tinfo.height );
+ assert( info.depth == tinfo.depth );
+ assert( info.arraySize == tinfo.arraySize );
+ assert( info.mipLevels == tinfo.mipLevels );
+ assert( info.miscFlags == tinfo.miscFlags );
+ assert( info.miscFlags2 == tinfo.miscFlags2 );
+ assert( info.dimension == tinfo.dimension );
+
+ delete image;
+ image = timage;
+ }
+
+ // --- Resize ------------------------------------------------------------------
+ if ( !width && !height )
+ {
+ width = info.width;
+ height = info.height;
+ }
+ else if ( info.width != width || info.height != height )
+ {
+ ScratchImage *timage = new ScratchImage;
+ if ( !timage )
+ {
+ wprintf( L" ERROR: Memory allocation failed\n" );
+ delete image;
+ goto LError;
+ }
+
+ hr = Resize( image->GetImages(), image->GetImageCount(), image->GetMetadata(), width, height, dwFilter | dwFilterOpts, *timage );
+ if ( FAILED(hr) )
+ {
+ wprintf( L" FAILED [resize] (%x)\n", hr);
+ delete timage;
+ delete image;
+ goto LError;
+ }
+
+ const TexMetadata& tinfo = timage->GetMetadata();
+
+ assert( tinfo.width == width && tinfo.height == height && tinfo.mipLevels == 1 );
+ info.width = tinfo.width;
+ info.height = tinfo.height;
+ info.mipLevels = 1;
+
+ assert( info.depth == tinfo.depth );
+ assert( info.arraySize == tinfo.arraySize );
+ assert( info.miscFlags == tinfo.miscFlags );
+ assert( info.miscFlags2 == tinfo.miscFlags2 );
+ assert( info.format == tinfo.format );
+ assert( info.dimension == tinfo.dimension );
+
+ delete image;
+ image = timage;
+ }
+
+ // --- Convert -----------------------------------------------------------------
+ if ( format == DXGI_FORMAT_UNKNOWN )
+ {
+ format = info.format;
+ }
+ else if ( info.format != format && !IsCompressed( format ) )
+ {
+ ScratchImage *timage = new ScratchImage;
+ if ( !timage )
+ {
+ wprintf( L" ERROR: Memory allocation failed\n" );
+ delete image;
+ goto LError;
+ }
+
+ hr = Convert( image->GetImages(), image->GetImageCount(), image->GetMetadata(), format, dwFilter | dwFilterOpts, 0.5f, *timage );
+ if ( FAILED(hr) )
+ {
+ wprintf( L" FAILED [convert] (%x)\n", hr);
+ delete timage;
+ delete image;
+ goto LError;
+ }
+
+ const TexMetadata& tinfo = timage->GetMetadata();
+
+ assert( tinfo.format == format );
+ info.format = tinfo.format;
+
+ assert( info.width == tinfo.width );
+ assert( info.height == tinfo.height );
+ assert( info.depth == tinfo.depth );
+ assert( info.arraySize == tinfo.arraySize );
+ assert( info.mipLevels == tinfo.mipLevels );
+ assert( info.miscFlags == tinfo.miscFlags );
+ assert( info.miscFlags2 == tinfo.miscFlags2 );
+ assert( info.dimension == tinfo.dimension );
+
+ delete image;
+ image = timage;
+ }
+
+ loadedImages.push_back( image );
+ }
+
+ // --- Create result ---------------------------------------------------------------
+ {
+ std::vector imageArray;
+ imageArray.reserve( images );
+
+ for( auto it = loadedImages.cbegin(); it != loadedImages.cend(); ++it )
+ {
+ const Image* img = (*it)->GetImage(0,0,0);
+ assert( img != 0 );
+ imageArray.push_back( *img );
+ }
+
+ ScratchImage result;
+ switch( dwOptions & ( (1 << OPT_CUBE) | (1 << OPT_VOLUME) | (1 << OPT_ARRAY) | (1 << OPT_CUBEARRAY) ) )
+ {
+ case (1 << OPT_VOLUME):
+ hr = result.Initialize3DFromImages( &imageArray[0], imageArray.size() );
+ break;
+
+ case (1 << OPT_ARRAY):
+ hr = result.InitializeArrayFromImages( &imageArray[0], imageArray.size(), (dwOptions & (1 << OPT_USE_DX10)) != 0 );
+ break;
+
+ case (1 << OPT_CUBE):
+ case (1 << OPT_CUBEARRAY):
+ hr = result.InitializeCubeFromImages( &imageArray[0], imageArray.size() );
+ break;
+ }
+
+ if ( FAILED(hr ) )
+ {
+ wprintf( L"FAILED building result image (%x)\n", hr);
+ goto LError;
+ }
+
+
+ // Write texture
+ wprintf( L"\nWriting %s ", szOutputFile);
+ PrintInfo( result.GetMetadata() );
+ wprintf( L"\n" );
+ fflush(stdout);
+
+ hr = SaveToDDSFile( result.GetImages(), result.GetImageCount(), result.GetMetadata(),
+ (dwOptions & (1 << OPT_USE_DX10) ) ? (DDS_FLAGS_FORCE_DX10_EXT|DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE,
+ szOutputFile );
+ if(FAILED(hr))
+ {
+ wprintf( L"\nFAILED (%x)\n", hr);
+ return 1;
+ }
+ wprintf( L"\n");
+ }
+
+ nReturn = 0;
+
+ goto LDone;
+
+LError:
+ nReturn = 1;
+
+LDone:
+
+ while(pConversion)
+ {
+ auto pConv = pConversion;
+ pConversion = pConversion->pNext;
+ delete pConv;
+ }
+
+ return nReturn;
+}
diff --git a/Texassemble/texassemble.rc b/Texassemble/texassemble.rc
new file mode 100644
index 0000000..ea1409e
--- /dev/null
+++ b/Texassemble/texassemble.rc
@@ -0,0 +1,76 @@
+// Microsoft Visual C++ generated resource script.
+//
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define IDC_STATIC -1
+#include
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_MAIN_ICON ICON "directx.ico"
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#define IDC_STATIC -1\r\n"
+ "#include \r\n"
+ "\r\n"
+ "\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+