news file header struct of Texture

This commit is contained in:
hyzboy 2021-12-13 13:47:08 +08:00
parent 065cf74aea
commit 29b98bba33
5 changed files with 82 additions and 91 deletions

View File

@ -1,7 +1,6 @@
#include<hgl/log/LogInfo.h> #include<hgl/log/LogInfo.h>
#include<IL/ilu.h> #include<IL/ilu.h>
#include"ILImage.h" #include"ILImage.h"
//#include"Image2D.h"
#include"TextureFileCreater.h" #include"TextureFileCreater.h"
#include"ImageConvertConfig.h" #include"ImageConvertConfig.h"
@ -31,19 +30,19 @@ bool ConvertImage(const OSString &filename,const ImageConvertConfig *cfg)
AutoDelete<TextureFileCreater> tex_file_creater=CreateTFC(fmt,channels); AutoDelete<TextureFileCreater> tex_file_creater=CreateTFC(fmt,channels);
if(!tex_file_creater->CreateTexFile(filename,TextureFileType::Tex2D)) if(!tex_file_creater->CreateTexFile(filename,VK_IMAGE_VIEW_TYPE_2D))
{ {
LOG_ERROR(OS_TEXT("Create Texture failed.")); LOG_ERROR(OS_TEXT("Create Texture failed."));
return(false); return(false);
} }
if(!tex_file_creater->WriteSize2D(miplevel,width,height)) if(!tex_file_creater->WriteSize2D(width,height))
{ {
LOG_ERROR(OS_TEXT("Write size failed.")); LOG_ERROR(OS_TEXT("Write size failed."));
return(false); return(false);
} }
if(!tex_file_creater->WritePixelFormat()) if(!tex_file_creater->WritePixelFormat(miplevel))
{ {
LOG_ERROR(OS_TEXT("Write format failed.")); LOG_ERROR(OS_TEXT("Write format failed."));
return(false); return(false);

View File

@ -62,25 +62,25 @@ bool ConvertCubemap(const OSString &filename,const OSStringList &file_list,const
AutoDelete<TextureFileCreater> tex_file_creater=CreateTFC(fmt,channels); AutoDelete<TextureFileCreater> tex_file_creater=CreateTFC(fmt,channels);
if (!tex_file_creater->CreateTexFile(filename, TextureFileType::TexCubemap)) if (!tex_file_creater->CreateTexFile(filename, VK_IMAGE_VIEW_TYPE_CUBE))
{ {
LOG_ERROR(OS_TEXT("Create Texture failed.")); LOG_ERROR(OS_TEXT("Create Texture failed."));
return(false); return(false);
} }
if (!tex_file_creater->WriteSize2D(miplevel, width, height)) if (!tex_file_creater->WriteSize2D(width, height))
{ {
LOG_ERROR(OS_TEXT("Write size failed.")); LOG_ERROR(OS_TEXT("Write size failed."));
return(false); return(false);
} }
if (!tex_file_creater->WritePixelFormat()) if (!tex_file_creater->WritePixelFormat(miplevel))
{ {
LOG_ERROR(OS_TEXT("Write format failed.")); LOG_ERROR(OS_TEXT("Write format failed."));
return(false); return(false);
} }
for(int face=0;face<6;face++) for(uint face=0;face<6;face++)
{ {
image[face].Bind(); image[face].Bind();
width=image[face].width(); width=image[face].width();
@ -126,7 +126,7 @@ bool ConvertImage(const OSString &filename,const ImageConvertConfig *cfg);
int os_main(int argc,os_char **argv) int os_main(int argc,os_char **argv)
{ {
std::cout<<"Cubemap to Texture Convert tools 1.2"<<std::endl<<std::endl; std::cout<<"Cubemap to Texture Convert tools 1.3"<<std::endl<<std::endl;
if(argc<=7) if(argc<=7)
{ {

View File

@ -1,47 +1,7 @@
#include"TextureFileCreater.h" #include"TextureFileCreater.h"
#include<hgl/filesystem/FileSystem.h> #include<hgl/filesystem/FileSystem.h>
namespace using namespace hgl::filesystem;
{
/**
*
* @param pathname
* @param filename
* @param fullname
*/
template<typename T>
inline bool SplitFilename(String<T> &pathname,String<T> &filename,const String<T> &fullname)
{
if(fullname.Length()<=1)
return false;
const T spear_char[] = { '/','\\' };
const int pos=fullname.FindRightChars(spear_char);
if(pos==-1)
return(false);
pathname.Strcpy(fullname,pos);
filename.Strcpy(fullname.c_str()+pos+1);
return(true);
}
template<typename T>
inline String<T> ReplaceExtName(const String<T> &old_name,const String<T> &new_extname,const T split_char='.')
{
if(old_name.Length()<=1)
return(String<T>::charOf(split_char)+new_extname);
const int pos=old_name.FindRightChar(split_char);
if(pos!=-1)
return old_name.SubString(0,pos)+new_extname;
else
return old_name+String<T>::charOf(split_char)+new_extname;
}
}//namespace
bool ToILType(ILuint &type,const uint8 bits,const ColorDataType cdt) bool ToILType(ILuint &type,const uint8 bits,const ColorDataType cdt)
{ {
@ -74,69 +34,103 @@ TextureFileCreater::~TextureFileCreater()
SAFE_CLEAR(dos); SAFE_CLEAR(dos);
} }
const char texture_file_type_name[uint(TextureFileType::RANGE_SIZE)][16]= constexpr os_char TEXTURE_FILE_EXT_NAME[][20]= //顺序必须等同VkImageViewType
{ {
"Tex1D", OS_TEXT(".Tex1D"),
"Tex2D", OS_TEXT(".Tex2D"),
"Tex3D", OS_TEXT(".Tex3D"),
"TexCubemap", OS_TEXT(".TexCube"),
"Tex1DArray", OS_TEXT(".Tex1DArray"),
"Tex2DArray", OS_TEXT(".Tex2DArray"),
"TexCubemapArray" OS_TEXT(".TexCubeArray")
}; };
bool TextureFileCreater::CreateTexFile(const OSString& old_filename, const TextureFileType& type) constexpr char TEXTURE_FILE_HEADER[]="Texture\x1A";
constexpr uint TEXTURE_FILE_HEADER_LENGTH=sizeof(TEXTURE_FILE_HEADER)-1;
bool TextureFileCreater::CreateTexFile(const OSString &old_filename, const VkImageViewType &type)
{ {
OSString pn,fn; OSString pn,fn;
SplitFilename<os_char>(pn,fn,old_filename); SplitFilename<os_char>(pn,fn,old_filename);
if(!RangeCheck<TextureFileType>(type)) if(type<VK_IMAGE_VIEW_TYPE_1D
||type>VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
{ {
LOG_ERROR(OS_TEXT("TextureFileCreater::WriteFileHeader(")+old_filename+OS_TEXT(") texture type error that it's ")+OSString::valueOf(int(type))); LOG_ERROR(OS_TEXT("TextureFileCreater::WriteFileHeader(")+old_filename+OS_TEXT(") texture type error that it's ")+OSString::valueOf(int(type)));
return(false); return(false);
} }
AnsiString file_type_name=texture_file_type_name[uint(type)]; filename=ReplaceExtName<os_char>(old_filename,TEXTURE_FILE_EXT_NAME[type]);
OSString file_ext_name=OS_TEXT(".")+ToOSString(file_type_name);
filename=ReplaceExtName<os_char>(old_filename,file_ext_name);
if(!fos.CreateTrunc(filename)) if(!fos.CreateTrunc(filename))
return(false); return(false);
dos=new io::LEDataOutputStream(&fos); dos=new io::LEDataOutputStream(&fos);
dos->Write(file_type_name.c_str(),file_type_name.Length()); dos->Write(TEXTURE_FILE_HEADER,TEXTURE_FILE_HEADER_LENGTH);
dos->WriteUint8(0x1A); dos->WriteUint8(0); //版本
dos->WriteUint8(3); //版本 dos->WriteUint8(type); //类型
return(true); return(true);
} }
bool TextureFileCreater::WriteSize1D(const uint mip_level,const uint length) bool TextureFileCreater::WriteSize1D(const uint32 length)
{ {
if(!dos->WriteUint8(mip_level))return(false); //mipmaps级数
if(!dos->WriteUint32(length))return(false); if(!dos->WriteUint32(length))return(false);
if(!dos->WriteUint64(0))return(false);
return(true); return(true);
} }
bool TextureFileCreater::WriteSize2D(const uint mip_level, const uint width,const uint height) bool TextureFileCreater::WriteSize2D(const uint32 width,const uint32 height)
{ {
if(!dos->WriteUint8(mip_level))return(false); //mipmaps级数
if(!dos->WriteUint32(width))return(false); if(!dos->WriteUint32(width))return(false);
if(!dos->WriteUint32(height))return(false); if(!dos->WriteUint32(height))return(false);
if(!dos->WriteUint32(0))return(false);
return(true); return(true);
} }
bool TextureFileCreater::WritePixelFormat() bool TextureFileCreater::WriteSize3D(const uint32 width,const uint32 height,const uint32 depth)
{
if(!dos->WriteUint32(width))return(false);
if(!dos->WriteUint32(height))return(false);
if(!dos->WriteUint32(depth))return(false);
return(true);
}
bool TextureFileCreater::WriteSize1DArray(const uint32 length,const uint32 layers)
{
if(!dos->WriteUint32(length))return(false);
if(!dos->WriteUint32(0))return(false);
if(!dos->WriteUint32(layers))return(false);
return(true);
}
bool TextureFileCreater::WriteSize2DArray(const uint32 width,const uint32 height,const uint32 layers)
{
if(!dos->WriteUint32(width))return(false);
if(!dos->WriteUint32(height))return(false);
if(!dos->WriteUint32(layers))return(false);
return(true);
}
bool TextureFileCreater::WritePixelFormat(const uint mip_level)
{ {
if (pixel_format->format > ColorFormat::COMPRESS) if (pixel_format->format > ColorFormat::COMPRESS)
{ {
if(!dos->WriteUint8(0))return(false); if(!dos->WriteUint8(0))return(false);
if(!dos->WriteUint16(uint(pixel_format->format)-uint(ColorFormat::BC1RGB)))return(false); if(!dos->WriteUint16(uint(pixel_format->format)-uint(ColorFormat::BC1RGB)))return(false);
constexpr uint8 spaces[7]={0,0,0,0,0,0,0};
if(dos->WriteUint8(spaces,7)!=7)return(false);
} }
else else
{ {
@ -146,6 +140,8 @@ bool TextureFileCreater::WritePixelFormat()
if(!dos->WriteUint8((uint8)pixel_format->type))return(false); //数据类型 if(!dos->WriteUint8((uint8)pixel_format->type))return(false); //数据类型
} }
if(!dos->WriteUint8(mip_level))return(false); //mipmaps级数
return(true); return(true);
} }

View File

@ -2,6 +2,7 @@
#include"ILImage.h" #include"ILImage.h"
#include"pixel_format.h" #include"pixel_format.h"
#include<vulkan/vulkan.h>
#include<hgl/io/FileOutputStream.h> #include<hgl/io/FileOutputStream.h>
#include<hgl/io/DataOutputStream.h> #include<hgl/io/DataOutputStream.h>
@ -9,19 +10,6 @@ using namespace hgl;
bool ToILType(ILuint &type,const uint8 bits,const ColorDataType cdt); bool ToILType(ILuint &type,const uint8 bits,const ColorDataType cdt);
enum class TextureFileType
{
Tex1D=0,
Tex2D,
Tex3D,
TexCubemap,
Tex1DArray,
Tex2DArray,
TexCubemapArray,
ENUM_CLASS_RANGE(Tex1D,TexCubemapArray)
};//
class TextureFileCreater class TextureFileCreater
{ {
protected: protected:
@ -43,10 +31,17 @@ public:
TextureFileCreater(const PixelFormat *pf); TextureFileCreater(const PixelFormat *pf);
virtual ~TextureFileCreater(); virtual ~TextureFileCreater();
virtual bool CreateTexFile(const OSString &, const TextureFileType &); virtual bool CreateTexFile(const OSString &, const VkImageViewType &);
virtual bool WriteSize1D(const uint miplevel,const uint length);
virtual bool WriteSize2D(const uint miplevel, const uint width,const uint height); virtual bool WriteSize1D(const uint32 length);
virtual bool WritePixelFormat(); virtual bool WriteSize2D(const uint32 width,const uint32 height);
virtual bool WriteSize3D(const uint32 width,const uint32 height,const uint32 depth);
bool WriteSizeCube(const uint32 width,const uint32 height){return WriteSize2D(width,height);}
virtual bool WriteSize1DArray(const uint32 length,const uint32 layers);
virtual bool WriteSize2DArray(const uint32 width,const uint32 height,const uint32 layers);
bool WriteSizeCubeArray(const uint32 width,const uint32 height,const uint32 layers){return WriteSize2DArray(width,height,layers);}
virtual bool WritePixelFormat(const uint miplevel);
virtual bool InitFormat(ILImage *)=0; virtual bool InitFormat(ILImage *)=0;
virtual uint32 Write()=0; virtual uint32 Write()=0;

View File

@ -29,7 +29,8 @@ protected:
void ProcFile(EnumFileConfig *efc,FileInfo &fi) override void ProcFile(EnumFileConfig *efc,FileInfo &fi) override
{ {
ConvertImage(fi.fullname,cfg); if(ConvertImage(fi.fullname,cfg))
++convert_count;
} }
public: public:
@ -44,7 +45,7 @@ public:
int os_main(int argc,os_char **argv) int os_main(int argc,os_char **argv)
{ {
std::cout<<"Image to Texture Convert tools 1.2"<<std::endl<<std::endl; std::cout<<"Image to Texture Convert tools 1.3"<<std::endl<<std::endl;
if(argc<=1) if(argc<=1)
{ {