finished newly TexConv/CubemapConv codes. converted file ok, but didn't test render.
This commit is contained in:
parent
4fbbba2c64
commit
065cf74aea
@ -25,29 +25,36 @@ bool ConvertImage(const OSString &filename,const ImageConvertConfig *cfg)
|
||||
return(false);
|
||||
}
|
||||
|
||||
TextureFileCreater *tex_file_creater;
|
||||
const PixelFormat *fmt=cfg->pixel_fmt[channels-1];
|
||||
uint width = image.width();
|
||||
uint height = image.height();
|
||||
|
||||
Image2D *origin_img=nullptr;
|
||||
AutoDelete<TextureFileCreater> tex_file_creater=CreateTFC(fmt,channels);
|
||||
|
||||
if(fmt->format<ColorFormat::COMPRESS)
|
||||
tex_file_creater=CreateTFC[channels-1](fmt,&image);
|
||||
else
|
||||
tex_file_creater=CreateTextureFileCreaterCompress(fmt,&image);
|
||||
|
||||
if(!tex_file_creater->WriteFileHeader(filename,TextureFileType::Tex2D,miplevel))
|
||||
if(!tex_file_creater->CreateTexFile(filename,TextureFileType::Tex2D))
|
||||
{
|
||||
tex_file_creater->Delete();
|
||||
LOG_ERROR(OS_TEXT("Write file header failed."));
|
||||
LOG_ERROR(OS_TEXT("Create Texture failed."));
|
||||
return(false);
|
||||
}
|
||||
|
||||
// origin_img=tex_file_creater->CreateImage2D();
|
||||
if(!tex_file_creater->WriteSize2D(miplevel,width,height))
|
||||
{
|
||||
LOG_ERROR(OS_TEXT("Write size failed."));
|
||||
return(false);
|
||||
}
|
||||
|
||||
tex_file_creater->InitFormat();
|
||||
if(!tex_file_creater->WritePixelFormat())
|
||||
{
|
||||
LOG_ERROR(OS_TEXT("Write format failed."));
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(!tex_file_creater->InitFormat(&image))
|
||||
{
|
||||
LOG_ERROR(OS_TEXT("Init texture format failed."));
|
||||
return(false);
|
||||
}
|
||||
|
||||
uint width=image.width();
|
||||
uint height=image.height();
|
||||
uint total=0;
|
||||
uint bytes=0;
|
||||
|
||||
@ -63,7 +70,7 @@ bool ConvertImage(const OSString &filename,const ImageConvertConfig *cfg)
|
||||
|
||||
total+=bytes;
|
||||
|
||||
if(i<miplevel)
|
||||
if(miplevel>1&&i<miplevel)
|
||||
{
|
||||
if(width>1)width>>=1;
|
||||
if(height>1)height>>=1;
|
||||
@ -76,7 +83,6 @@ bool ConvertImage(const OSString &filename,const ImageConvertConfig *cfg)
|
||||
|
||||
tex_file_creater->Close();
|
||||
|
||||
delete tex_file_creater;
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include<hgl/util/cmd/CmdParse.h>
|
||||
#include<hgl/filesystem/FileSystem.h>
|
||||
#include<hgl/type/StringList.h>
|
||||
#include<hgl/log/LogInfo.h>
|
||||
#include"ILImage.h"
|
||||
#include"TextureFileCreater.h"
|
||||
#include"ImageConvertConfig.h"
|
||||
@ -59,24 +60,38 @@ bool ConvertCubemap(const OSString &filename,const OSStringList &file_list,const
|
||||
uint total=0;
|
||||
uint bytes=0;
|
||||
|
||||
AutoDelete<TextureFileCreater> tex_file_creater=CreateTFC(fmt,channels);
|
||||
|
||||
if (!tex_file_creater->CreateTexFile(filename, TextureFileType::TexCubemap))
|
||||
{
|
||||
LOG_ERROR(OS_TEXT("Create Texture failed."));
|
||||
return(false);
|
||||
}
|
||||
|
||||
if (!tex_file_creater->WriteSize2D(miplevel, width, height))
|
||||
{
|
||||
LOG_ERROR(OS_TEXT("Write size failed."));
|
||||
return(false);
|
||||
}
|
||||
|
||||
if (!tex_file_creater->WritePixelFormat())
|
||||
{
|
||||
LOG_ERROR(OS_TEXT("Write format failed."));
|
||||
return(false);
|
||||
}
|
||||
|
||||
for(int face=0;face<6;face++)
|
||||
{
|
||||
TextureFileCreater *tex_file_creater;
|
||||
image[face].Bind();
|
||||
width=image[face].width();
|
||||
height=image[face].height();
|
||||
|
||||
if(fmt->format<ColorFormat::COMPRESS)
|
||||
tex_file_creater=CreateTFC[channels-1](fmt,&image[face]);
|
||||
else
|
||||
tex_file_creater=CreateTextureFileCreaterCompress(fmt,&image[face]);
|
||||
|
||||
if(!tex_file_creater->WriteFileHeader(filename,TextureFileType::TexCubemap,miplevel))
|
||||
if (!tex_file_creater->InitFormat(&image[face]))
|
||||
{
|
||||
tex_file_creater->Delete();
|
||||
LOG_ERROR(OS_TEXT("Write file header failed."));
|
||||
LOG_ERROR(OS_TEXT("Init texture format failed."));
|
||||
return(false);
|
||||
}
|
||||
|
||||
tex_file_creater->InitFormat();
|
||||
|
||||
for(int i=0;i<miplevel;i++)
|
||||
{
|
||||
bytes=tex_file_creater->Write();
|
||||
@ -89,7 +104,7 @@ bool ConvertCubemap(const OSString &filename,const OSStringList &file_list,const
|
||||
|
||||
total+=bytes;
|
||||
|
||||
if(i<miplevel)
|
||||
if(miplevel>1&&i<miplevel)
|
||||
{
|
||||
if(width>1)width>>=1;
|
||||
if(height>1)height>>=1;
|
||||
@ -97,12 +112,10 @@ bool ConvertCubemap(const OSString &filename,const OSStringList &file_list,const
|
||||
image[face].Resize(width,height);
|
||||
}
|
||||
}
|
||||
|
||||
tex_file_creater->Close();
|
||||
|
||||
delete tex_file_creater;
|
||||
}
|
||||
|
||||
|
||||
tex_file_creater->Close();
|
||||
|
||||
LOG_INFO(OS_TEXT("pixel total length: ")+OSString::valueOf(total)+OS_TEXT(" bytes."));
|
||||
return(true);
|
||||
}
|
||||
@ -118,7 +131,7 @@ int os_main(int argc,os_char **argv)
|
||||
if(argc<=7)
|
||||
{
|
||||
std::cout<< "Command format:\n"
|
||||
"\tCubemapConv [/R:][/RG:][/RGB:][/RGBA:] [/mip] <output texture filename> <neg x>,<neg y>,<neg z>,<pos x>,<pos y>,<pos z>\n\n";
|
||||
"\tCubemapConv [/R:][/RG:][/RGB:][/RGBA:] [/mip] <output texture filename> <pos x>,<neg x>,<pos y>,<neg y>,<pos z>,<neg z>\n\n";
|
||||
|
||||
PrintFormatList();
|
||||
return 0;
|
||||
@ -138,20 +151,36 @@ int os_main(int argc,os_char **argv)
|
||||
CMP_RegisterHostPlugins();
|
||||
CMP_InitializeBCLibrary();
|
||||
|
||||
OSString out_filename=argv[argc-8];
|
||||
OSString out_filename=argv[argc-7];
|
||||
OSStringList file_list;
|
||||
|
||||
for(int i=argc-7;i<argc-1;i++)
|
||||
for(int i=argc-6;i<argc;i++)
|
||||
{
|
||||
if(filesystem::FileCanRead(argv[i]))
|
||||
file_list.Add(argv[i]);
|
||||
else
|
||||
{
|
||||
LOG_ERROR(OS_TEXT("Can't check file ")+OSString(argv[i]));
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
if(file_list.GetCount()==6)
|
||||
{
|
||||
os_out<<OS_TEXT("output: ")<<out_filename.c_str()<<std::endl;
|
||||
constexpr os_char face_name[6][3]=
|
||||
{
|
||||
OS_TEXT("+X"),
|
||||
OS_TEXT("-X"),
|
||||
OS_TEXT("+Y"),
|
||||
OS_TEXT("-Y"),
|
||||
OS_TEXT("+Z"),
|
||||
OS_TEXT("-Z")
|
||||
};
|
||||
|
||||
for(int i=0;i<6;i++)
|
||||
os_out<<OS_TEXT("source ")<<OSString::valueOf(i).c_str()<<OS_TEXT(": ")<<file_list[i].c_str()<<std::endl;
|
||||
os_out<<OS_TEXT(" ")<<face_name[i]<<OS_TEXT(": ")<<file_list[i].c_str()<<std::endl;
|
||||
|
||||
os_out<<OS_TEXT("output: ")<<out_filename.c_str()<<std::endl;
|
||||
|
||||
ConvertCubemap(out_filename,file_list,&icc);
|
||||
}
|
||||
|
@ -61,12 +61,12 @@ bool ToILType(ILuint &type,const uint8 bits,const ColorDataType cdt)
|
||||
return(type);
|
||||
}
|
||||
|
||||
TextureFileCreater::TextureFileCreater(const PixelFormat *pf,ILImage *img)
|
||||
TextureFileCreater::TextureFileCreater(const PixelFormat *pf)
|
||||
{
|
||||
pixel_format=pf;
|
||||
image=img;
|
||||
|
||||
dos=nullptr;
|
||||
image=nullptr;
|
||||
}
|
||||
|
||||
TextureFileCreater::~TextureFileCreater()
|
||||
@ -85,7 +85,7 @@ const char texture_file_type_name[uint(TextureFileType::RANGE_SIZE)][16]=
|
||||
"TexCubemapArray"
|
||||
};
|
||||
|
||||
bool TextureFileCreater::WriteFileHeader(const OSString &old_filename,const TextureFileType &type,const uint mip_level)
|
||||
bool TextureFileCreater::CreateTexFile(const OSString& old_filename, const TextureFileType& type)
|
||||
{
|
||||
OSString pn,fn;
|
||||
|
||||
@ -110,30 +110,43 @@ bool TextureFileCreater::WriteFileHeader(const OSString &old_filename,const Text
|
||||
dos->Write(file_type_name.c_str(),file_type_name.Length());
|
||||
dos->WriteUint8(0x1A);
|
||||
dos->WriteUint8(3); //版本
|
||||
dos->WriteUint8(mip_level); //mipmaps级数
|
||||
dos->WriteUint32(image->width());
|
||||
|
||||
if(type!=TextureFileType::Tex1D
|
||||
||type!=TextureFileType::Tex1DArray)
|
||||
dos->WriteUint32(image->height());
|
||||
return(true);
|
||||
}
|
||||
|
||||
if(type==TextureFileType::Tex3D)
|
||||
dos->WriteUint32(image->depth());
|
||||
|
||||
if(pixel_format->format>ColorFormat::COMPRESS)
|
||||
bool TextureFileCreater::WriteSize1D(const uint mip_level,const uint length)
|
||||
{
|
||||
if(!dos->WriteUint8(mip_level))return(false); //mipmaps级数
|
||||
if(!dos->WriteUint32(length))return(false);
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool TextureFileCreater::WriteSize2D(const uint mip_level, const uint width,const uint height)
|
||||
{
|
||||
if(!dos->WriteUint8(mip_level))return(false); //mipmaps级数
|
||||
if(!dos->WriteUint32(width))return(false);
|
||||
if(!dos->WriteUint32(height))return(false);
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool TextureFileCreater::WritePixelFormat()
|
||||
{
|
||||
if (pixel_format->format > ColorFormat::COMPRESS)
|
||||
{
|
||||
dos->WriteUint8(0);
|
||||
dos->WriteUint16(uint(pixel_format->format)-uint(ColorFormat::BC1RGB));
|
||||
if(!dos->WriteUint8(0))return(false);
|
||||
if(!dos->WriteUint16(uint(pixel_format->format)-uint(ColorFormat::BC1RGB)))return(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
dos->WriteUint8(pixel_format->channels); //颜色通道数
|
||||
dos->WriteUint8((uint8 *)pixel_format->color,4); //颜色标记
|
||||
dos->WriteUint8(pixel_format->bits,4); //颜色位数
|
||||
dos->WriteUint8((uint8)pixel_format->type); //数据类型
|
||||
if(!dos->WriteUint8(pixel_format->channels))return(false); //颜色通道数
|
||||
if(!dos->WriteUint8((uint8*)pixel_format->color, 4))return(false); //颜色标记
|
||||
if(!dos->WriteUint8(pixel_format->bits, 4))return(false); //颜色位数
|
||||
if(!dos->WriteUint8((uint8)pixel_format->type))return(false); //数据类型
|
||||
}
|
||||
|
||||
return(true);
|
||||
return(true);
|
||||
}
|
||||
|
||||
uint32 TextureFileCreater::Write(void *data,const uint total_bytes)
|
||||
@ -165,4 +178,32 @@ void TextureFileCreater::Delete()
|
||||
Close();
|
||||
|
||||
filesystem::FileDelete(filename);
|
||||
}
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterR(const PixelFormat *);
|
||||
TextureFileCreater *CreateTextureFileCreaterRG(const PixelFormat *);
|
||||
TextureFileCreater *CreateTextureFileCreaterRGB(const PixelFormat *);
|
||||
TextureFileCreater *CreateTextureFileCreaterRGBA(const PixelFormat *);
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterCompress(const PixelFormat *);
|
||||
|
||||
TextureFileCreater *CreateTFC(const PixelFormat *fmt,const int channels)
|
||||
{
|
||||
if(!fmt)return(nullptr);
|
||||
if(channels<1||channels>4)return(nullptr);
|
||||
|
||||
using CTFC_FUNC=TextureFileCreater *(*)(const PixelFormat *);
|
||||
|
||||
static CTFC_FUNC CreateTFC[4]=
|
||||
{
|
||||
CreateTextureFileCreaterR,
|
||||
CreateTextureFileCreaterRG,
|
||||
CreateTextureFileCreaterRGB,
|
||||
CreateTextureFileCreaterRGBA
|
||||
};
|
||||
|
||||
if(fmt->format<ColorFormat::COMPRESS)
|
||||
return CreateTFC[channels-1](fmt);
|
||||
else
|
||||
return CreateTextureFileCreaterCompress(fmt);
|
||||
}
|
@ -26,9 +26,8 @@ class TextureFileCreater
|
||||
{
|
||||
protected:
|
||||
|
||||
const PixelFormat *pixel_format;
|
||||
|
||||
ILImage *image;
|
||||
const PixelFormat *pixel_format;
|
||||
|
||||
protected:
|
||||
|
||||
@ -41,26 +40,19 @@ protected:
|
||||
|
||||
public:
|
||||
|
||||
TextureFileCreater(const PixelFormat *pf,ILImage *);
|
||||
TextureFileCreater(const PixelFormat *pf);
|
||||
virtual ~TextureFileCreater();
|
||||
|
||||
virtual bool WriteFileHeader(const OSString &,const TextureFileType &,const uint);
|
||||
virtual bool CreateTexFile(const OSString &, const TextureFileType &);
|
||||
virtual bool WriteSize1D(const uint miplevel,const uint length);
|
||||
virtual bool WriteSize2D(const uint miplevel, const uint width,const uint height);
|
||||
virtual bool WritePixelFormat();
|
||||
|
||||
virtual bool InitFormat()=0;
|
||||
virtual bool InitFormat(ILImage *)=0;
|
||||
virtual uint32 Write()=0;
|
||||
|
||||
virtual void Close();
|
||||
virtual void Delete();
|
||||
};//class TextureFileCreater
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterR(const PixelFormat *,ILImage *);
|
||||
TextureFileCreater *CreateTextureFileCreaterRG(const PixelFormat *,ILImage *);
|
||||
TextureFileCreater *CreateTextureFileCreaterRGB(const PixelFormat *,ILImage *);
|
||||
TextureFileCreater *CreateTextureFileCreaterRGBA(const PixelFormat *,ILImage *);
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterCompress(const PixelFormat *,ILImage *);
|
||||
|
||||
using CTFC_FUNC=TextureFileCreater *(*)(const PixelFormat *,ILImage *);
|
||||
|
||||
static CTFC_FUNC CreateTFC[4]={CreateTextureFileCreaterR,CreateTextureFileCreaterRG,CreateTextureFileCreaterRGB,CreateTextureFileCreaterRGBA};
|
||||
|
||||
TextureFileCreater *CreateTFC(const PixelFormat *,const int channels);
|
||||
|
@ -27,8 +27,10 @@ public:
|
||||
|
||||
public:
|
||||
|
||||
bool InitFormat() override
|
||||
bool InitFormat(ILImage* img) override
|
||||
{
|
||||
image = img;
|
||||
|
||||
channels=image->channels();
|
||||
type=image->type();
|
||||
|
||||
@ -255,7 +257,7 @@ public:
|
||||
}
|
||||
};//class TextureFileCreaterCompress:public TextureFileCreater
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterCompress(const PixelFormat *pf,ILImage *image)
|
||||
TextureFileCreater *CreateTextureFileCreaterCompress(const PixelFormat *pf)
|
||||
{
|
||||
return(new TextureFileCreaterCompress(pf,image));
|
||||
return(new TextureFileCreaterCompress(pf));
|
||||
}
|
||||
|
@ -12,8 +12,10 @@ public:
|
||||
|
||||
public:
|
||||
|
||||
bool InitFormat() override
|
||||
bool InitFormat(ILImage *img) override
|
||||
{
|
||||
image=img;
|
||||
|
||||
if(!ToILType(type,pixel_format->bits[0],pixel_format->type))
|
||||
return(false);
|
||||
|
||||
@ -36,7 +38,7 @@ public:
|
||||
}
|
||||
};//class TextureFileCreaterR:public TextureFileCreater
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterR(const PixelFormat *pf,ILImage *image)
|
||||
TextureFileCreater *CreateTextureFileCreaterR(const PixelFormat *pf)
|
||||
{
|
||||
return(new TextureFileCreaterR(pf,image));
|
||||
return(new TextureFileCreaterR(pf));
|
||||
}
|
@ -12,8 +12,10 @@ public:
|
||||
|
||||
public:
|
||||
|
||||
bool InitFormat() override
|
||||
bool InitFormat(ILImage *img) override
|
||||
{
|
||||
image=img;
|
||||
|
||||
if(!ToILType(type,pixel_format->bits[0],pixel_format->type))
|
||||
return(false);
|
||||
|
||||
@ -34,7 +36,7 @@ public:
|
||||
}
|
||||
};//class TextureFileCreaterRG:public TextureFileCreater
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterRG(const PixelFormat *pf,ILImage *image)
|
||||
TextureFileCreater *CreateTextureFileCreaterRG(const PixelFormat *pf)
|
||||
{
|
||||
return(new TextureFileCreaterRG(pf,image));
|
||||
return(new TextureFileCreaterRG(pf));
|
||||
}
|
||||
|
@ -12,8 +12,10 @@ public:
|
||||
|
||||
public:
|
||||
|
||||
bool InitFormat() override
|
||||
bool InitFormat(ILImage* img) override
|
||||
{
|
||||
image = img;
|
||||
|
||||
if(pixel_format->format==ColorFormat::RGB32U
|
||||
||pixel_format->format==ColorFormat::RGB32I
|
||||
||pixel_format->format==ColorFormat::RGB32F)
|
||||
@ -114,7 +116,7 @@ public:
|
||||
}
|
||||
};//class TextureFileCreaterRGB:public TextureFileCreater
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterRGB(const PixelFormat *pf,ILImage *image)
|
||||
TextureFileCreater *CreateTextureFileCreaterRGB(const PixelFormat *pf)
|
||||
{
|
||||
return(new TextureFileCreaterRGB(pf,image));
|
||||
return(new TextureFileCreaterRGB(pf));
|
||||
}
|
||||
|
@ -9,9 +9,11 @@ class TextureFileCreaterRGBA:public TextureFileCreater
|
||||
public:
|
||||
|
||||
using TextureFileCreater::TextureFileCreater;
|
||||
|
||||
bool InitFormat() override
|
||||
|
||||
bool InitFormat(ILImage* img) override
|
||||
{
|
||||
image = img;
|
||||
|
||||
if(pixel_format->format==ColorFormat::RGBA8
|
||||
||pixel_format->format==ColorFormat::RGBA16
|
||||
||pixel_format->format==ColorFormat::RGBA16U
|
||||
@ -182,7 +184,7 @@ public:
|
||||
}
|
||||
};//class TextureFileCreaterRGB:public TextureFileCreater
|
||||
|
||||
TextureFileCreater *CreateTextureFileCreaterRGBA(const PixelFormat *pf,ILImage *image)
|
||||
TextureFileCreater *CreateTextureFileCreaterRGBA(const PixelFormat *pf)
|
||||
{
|
||||
return(new TextureFileCreaterRGBA(pf,image));
|
||||
return(new TextureFileCreaterRGBA(pf));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user