From f86f8625228465161e6719c9d92dc2555fffdcc2 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 6 Dec 2021 12:07:38 +0800 Subject: [PATCH] Created ParamParse.cpp/.h and ImageConvertConfig.h --- CMakeLists.txt | 8 ++- ConvertImage.cpp | 20 ++----- CubemapConvert.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++ ImageConvertConfig.h | 18 +++++++ ParamParse.cpp | 43 +++++++++++++++ ParamParse.h | 10 ++++ TextureFileCreater.h | 12 +++++ main.cpp | 79 +++++++-------------------- 8 files changed, 238 insertions(+), 78 deletions(-) create mode 100644 ImageConvertConfig.h create mode 100644 ParamParse.cpp create mode 100644 ParamParse.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6317655..e68523c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,8 @@ SET(ILIMAGE_SOURCE ILImage.h # Image2D.cpp) SET(PIXEL_FORMAT_SOURCE pixel_format.cpp - pixel_format.h) + pixel_format.h + ImageConvertConfig.h) SET(TEXTURE_FILE_CREATER_SOURCE TextureFileCreater.h TextureFileCreater.cpp @@ -48,11 +49,14 @@ SET(TEXTURE_FILE_CREATER_SOURCE TextureFileCreater.h TextureFileCreaterRGBA.cpp TextureFileCreaterCompress.cpp) +SET(PARAM_PARSE_SOURCE ParamParse.h ParamParse.cpp) + SOURCE_GROUP("Image File" FILES ${ILIMAGE_SOURCE}) SOURCE_GROUP("Pixel Format" FILES ${PIXEL_FORMAT_SOURCE}) SOURCE_GROUP("Texture File Creater" FILES ${TEXTURE_FILE_CREATER_SOURCE}) +SOURCE_GROUP("CMD Param parse" FILES ${PARAM_PARSE_SOURCE}) -SET(TEX_CONV_SOURCE ${ILIMAGE_SOURCE} ${PIXEL_FORMAT_SOURCE} ${TEXTURE_FILE_CREATER_SOURCE}) +SET(TEX_CONV_SOURCE ${ILIMAGE_SOURCE} ${PIXEL_FORMAT_SOURCE} ${TEXTURE_FILE_CREATER_SOURCE} ${PARAM_PARSE_SOURCE}) SET(TEX_CONV_LIBRARY CMCore CMPlatform CMUtil DevIL ILU CMP_Compressonator CMP_Framework CMP_Core) add_executable(TexConv ${TEX_CONV_SOURCE} main.cpp ConvertImage.cpp) diff --git a/ConvertImage.cpp b/ConvertImage.cpp index bc67219..bfbcba6 100644 --- a/ConvertImage.cpp +++ b/ConvertImage.cpp @@ -1,21 +1,11 @@ #include #include #include"ILImage.h" -#include"Image2D.h" +//#include"Image2D.h" #include"TextureFileCreater.h" +#include"ImageConvertConfig.h" -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}; - -bool ConvertImage(const OSString &filename,const PixelFormat **pf,const bool mipmaps) +bool ConvertImage(const OSString &filename,const ImageConvertConfig *cfg) { ILImage image; @@ -24,7 +14,7 @@ bool ConvertImage(const OSString &filename,const PixelFormat **pf,const bool mip int miplevel=1; - if(mipmaps) + if(cfg->gen_mipmaps) miplevel=hgl::GetMipLevel(image.width(),image.height()); const uint channels=image.channels(); @@ -36,7 +26,7 @@ bool ConvertImage(const OSString &filename,const PixelFormat **pf,const bool mip } TextureFileCreater *tex_file_creater; - const PixelFormat *fmt=pf[channels-1]; + const PixelFormat *fmt=cfg->pixel_fmt[channels-1]; Image2D *origin_img=nullptr; diff --git a/CubemapConvert.cpp b/CubemapConvert.cpp index e69de29..e263018 100644 --- a/CubemapConvert.cpp +++ b/CubemapConvert.cpp @@ -0,0 +1,126 @@ +#include +#include +#include +#include"ILImage.h" +#include"TextureFileCreater.h" +#include"ImageConvertConfig.h" +#include"CMP_CompressonatorLib/Compressonator.h" +#include"ParamParse.h" + +using namespace hgl; +using namespace hgl::filesystem; +using namespace hgl::util; + +bool ConvertImage(const OSString &filename,const ImageConvertConfig *cfg) +{ + ILImage image; + + if(!image.LoadFile(filename)) + return(false); + + int miplevel=1; + + if(cfg->gen_mipmaps) + miplevel=hgl::GetMipLevel(image.width(),image.height()); + + const uint channels=image.channels(); + + if(channels<0||channels>4) + { + LOG_ERROR(OS_TEXT("image format don't support ")); + return(false); + } + + TextureFileCreater *tex_file_creater; + const PixelFormat *fmt=cfg->pixel_fmt[channels-1]; + + Image2D *origin_img=nullptr; + + if(fmt->formatWriteFileHeader(filename,TextureFileType::TexCubemap,miplevel)) + { + tex_file_creater->Delete(); + LOG_ERROR(OS_TEXT("Write file header failed.")); + return(false); + } + + tex_file_creater->InitFormat(); + + uint width=image.width(); + uint height=image.height(); + uint total=0; + uint bytes=0; + + for(int i=0;iWrite(); + + if(bytes<=0) + { + tex_file_creater->Delete(); + return(false); + } + + total+=bytes; + + if(i1)width>>=1; + if(height>1)height>>=1; + + image.Resize(width,height); + } + } + + LOG_INFO(OS_TEXT("pixel total length: ")+OSString::valueOf(total)+OS_TEXT(" bytes.")); + + tex_file_creater->Close(); + + delete tex_file_creater; + return(true); +} + +void CMP_RegisterHostPlugins(); + +bool ConvertImage(const OSString &filename,const ImageConvertConfig *cfg); + +int os_main(int argc,os_char **argv) +{ + std::cout<<"Cubemap to Texture Convert tools 1.2"<\n\n"; + + PrintFormatList(); + return 0; + } + + CmdParse cp(argc,argv); + + ImageConvertConfig icc; + + if(cp.Find(OS_TEXT("/mip"))!=-1)icc.gen_mipmaps=true; //检测是否生成mipmaps + + ParseParamColorKey(&icc,cp); + ParseParamFormat(&icc,cp); //检测推荐格式 + + ilInit(); + + CMP_RegisterHostPlugins(); + CMP_InitializeBCLibrary(); + + if(filesystem::FileCanRead(argv[argc-1])) + { + ConvertImage(argv[argc-1],&icc); + } + + CMP_ShutdownBCLibrary(); + ilShutDown(); + return 0; +} diff --git a/ImageConvertConfig.h b/ImageConvertConfig.h new file mode 100644 index 0000000..ca4ee04 --- /dev/null +++ b/ImageConvertConfig.h @@ -0,0 +1,18 @@ +锘#pragma once +#include"pixel_format.h" + +struct ImageConvertConfig +{ + const PixelFormat * pixel_fmt[4]; ///<閫変腑鏍煎紡 + bool gen_mipmaps; ///<鏄惁浜х敓mipmaps + + bool use_color_key; ///<鏄惁浣跨敤ColorKey + uint8 color_key[3]; ///pixel_fmt[0]=ParseParamFormat(cmd,OS_TEXT("/R:"), GetPixelFormat(ColorFormat::R8)); + icc->pixel_fmt[1]=ParseParamFormat(cmd,OS_TEXT("/RG:"), GetPixelFormat(ColorFormat::RG8)); + icc->pixel_fmt[2]=ParseParamFormat(cmd,OS_TEXT("/RGB:"), GetPixelFormat(ColorFormat::RGB565)); + icc->pixel_fmt[3]=ParseParamFormat(cmd,OS_TEXT("/RGBA:"), GetPixelFormat(ColorFormat::RGBA8)); + + for(uint i=0;i<4;i++) + std::cout<<(i+1)<<": "<pixel_fmt[i]->name<color_key[0],rgbstr+0); + ParseHexStr(icc->color_key[1],rgbstr+2); + ParseHexStr(icc->color_key[2],rgbstr+4); + + icc->use_color_key=true; +} \ No newline at end of file diff --git a/ParamParse.h b/ParamParse.h new file mode 100644 index 0000000..1909d62 --- /dev/null +++ b/ParamParse.h @@ -0,0 +1,10 @@ +#pragma once +#include +#include"ImageConvertConfig.h" + +using namespace hgl; +using namespace hgl::util; + +const PixelFormat *ParseParamFormat(const CmdParse &cmd,const os_char *flag,const PixelFormat *default_format); +void ParseParamFormat(ImageConvertConfig *icc,const CmdParse &cmd); +void ParseParamColorKey(ImageConvertConfig *icc,const CmdParse &cmd); \ No newline at end of file diff --git a/TextureFileCreater.h b/TextureFileCreater.h index a9fd613..6b61748 100644 --- a/TextureFileCreater.h +++ b/TextureFileCreater.h @@ -52,3 +52,15 @@ public: 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}; + diff --git a/main.cpp b/main.cpp index 3c175cf..ce431cb 100644 --- a/main.cpp +++ b/main.cpp @@ -1,90 +1,45 @@ 锘#include #include #include -#include -#include #include #include #include -#include -#include"pixel_format.h" -#include"IntelTextureCompression/ispc_texcomp.h" #include"CMP_CompressonatorLib/Compressonator.h" +#include"ImageConvertConfig.h" +#include"ParamParse.h" using namespace hgl; using namespace hgl::filesystem; using namespace hgl::util; -bool sub_folder =false; - -const PixelFormat * pixel_fmt[4] ={nullptr,nullptr,nullptr,nullptr}; //閫変腑鏍煎紡 -bool gen_mipmaps =false; //鏄惁浜х敓mipmaps - -bool use_color_key =false; //鏄惁浣跨敤ColorKey -uint8 color_key[3]; //ColorKey棰滆壊 +bool sub_folder =false; void CMP_RegisterHostPlugins(); -bool ConvertImage(const OSString &filename,const PixelFormat **pf,const bool mipmap); - -const PixelFormat *ParseParamFormat(const CmdParse &cmd,const os_char *flag,const PixelFormat *default_format) -{ - OSString fmtstr; - - if(!cmd.GetString(flag,fmtstr))return(default_format); - - const PixelFormat *result=GetPixelFormat(fmtstr.c_str()); - - if(result)return(result); - - LOG_INFO(OS_TEXT("[FORMAT ERROR] Don't support ")+fmtstr+OS_TEXT(" format.")); - - return default_format; -} - -void ParseParamFormat(const CmdParse &cmd) -{ - //鎸囧畾鏍煎紡 - pixel_fmt[0]=ParseParamFormat(cmd,OS_TEXT("/R:"), GetPixelFormat(ColorFormat::R8)); - pixel_fmt[1]=ParseParamFormat(cmd,OS_TEXT("/RG:"), GetPixelFormat(ColorFormat::RG8)); - pixel_fmt[2]=ParseParamFormat(cmd,OS_TEXT("/RGB:"), GetPixelFormat(ColorFormat::RGB565)); - pixel_fmt[3]=ParseParamFormat(cmd,OS_TEXT("/RGBA:"), GetPixelFormat(ColorFormat::RGBA8)); - - for(uint i=0;i<4;i++) - std::cout<<(i+1)<<": "<name<