From db72c400829ea0936a8e80ecfb1a60efd1f968c1 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 30 May 2019 19:24:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ModelConvert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 24 +- example/Vulkan/Geometry3D.cpp | 3 - inc/hgl/graph/NTB.h | 18 + inc/hgl/graph/TextureType.h | 37 ++ res/model/vulkanlogo.assbin | Bin 0 -> 349204 bytes src/CMakeLists.txt | 1 + src/Tools/CMakeLists.txt | 1 + src/Tools/ModelConvert/AssimpLoader.cpp | 761 ++++++++++++++++++++++++ src/Tools/ModelConvert/AssimpLoader.h | 159 +++++ src/Tools/ModelConvert/CMakeLists.txt | 6 + src/Tools/ModelConvert/MainUnit.cpp | 35 ++ 11 files changed, 1030 insertions(+), 15 deletions(-) create mode 100644 inc/hgl/graph/NTB.h create mode 100644 inc/hgl/graph/TextureType.h create mode 100644 res/model/vulkanlogo.assbin create mode 100644 src/Tools/CMakeLists.txt create mode 100644 src/Tools/ModelConvert/AssimpLoader.cpp create mode 100644 src/Tools/ModelConvert/AssimpLoader.h create mode 100644 src/Tools/ModelConvert/CMakeLists.txt create mode 100644 src/Tools/ModelConvert/MainUnit.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ec7b24a1..7977fe74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,8 +36,20 @@ add_definitions(-DMATH_RIGHTHANDED_CAMERA) add_definitions(-DMATH_AVX) add_definitions(-DGLFW_INCLUDE_VULKAN) +SET(ULRE ULRE.Base +# ULRE.Util + ULRE.RenderDevice.Vulkan + ULRE.SceneGraph + ULRE.Platform + MathGeoLib + spirv-cross-core +# jsoncpp_lib + ${RENDER_LIBRARY} + ${Vulkan_LIBRARIES}) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdpty/MathGeoLib/src) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdpty/NvTriStrip) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdpty/assimp/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc) SET(ROOT_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/inc) @@ -51,16 +63,4 @@ add_subdirectory(3rdpty/NvTriStrip) add_subdirectory(3rdpty/assimp) add_subdirectory(src) -SET(ULRE ULRE.Base -# ULRE.Util - ULRE.RenderDevice.Vulkan - ULRE.SceneGraph - ULRE.Platform - MathGeoLib - spirv-cross-core - assimp -# jsoncpp_lib - ${RENDER_LIBRARY} - ${Vulkan_LIBRARIES}) - add_subdirectory(example) diff --git a/example/Vulkan/Geometry3D.cpp b/example/Vulkan/Geometry3D.cpp index e8d29510..a5385508 100644 --- a/example/Vulkan/Geometry3D.cpp +++ b/example/Vulkan/Geometry3D.cpp @@ -10,9 +10,6 @@ using namespace hgl; using namespace hgl::graph; -bool SaveToFile(const OSString &filename,VK_NAMESPACE::PipelineCreater *pc); -bool LoadFromFile(const OSString &filename,VK_NAMESPACE::PipelineCreater *pc); - constexpr uint32_t SCREEN_WIDTH=1280; constexpr uint32_t SCREEN_HEIGHT=720; diff --git a/inc/hgl/graph/NTB.h b/inc/hgl/graph/NTB.h new file mode 100644 index 00000000..228d6943 --- /dev/null +++ b/inc/hgl/graph/NTB.h @@ -0,0 +1,18 @@ +#ifndef HGL_GRAPH_NTB_INCLUDE +#define HGL_GRAPH_NTB_INCLUDE + +#define NTB_BIT_NORMAL (1<<0) +#define NTB_BIT_TANGENT (1<<1) +#define NTB_BIT_BINORMAL (1<<2) + +#define NTB_BIT_ALL (NTB_BIT_NORMAL|NTB_BIT_TANGENT|NTB_BIT_BINORMAL) + +#define NTB_BIT_COMPRESS_NORMAL (1<<3) +#define NTB_BIT_COMPRESS_TANGENT (1<<4) +#define NTB_BIT_COMPRESS_BINORMAL (1<<5) + +#define NTB_BIT_COMPRESS_ALL (NTB_BIT_COMPRESS_NORMAL|NTB_BIT_COMPRESS_TANGENT|NTB_BIT_COMPRESS_BINORMAL) + +#define NTB_BIT_COMPRESS_NORMAL_TANGENT (1<<6) + +#endif//HGL_GRAPH_NTB_INCLUDE \ No newline at end of file diff --git a/inc/hgl/graph/TextureType.h b/inc/hgl/graph/TextureType.h new file mode 100644 index 00000000..bf355b1c --- /dev/null +++ b/inc/hgl/graph/TextureType.h @@ -0,0 +1,37 @@ +#ifndef HGL_GRAPH_TEXTURE_TYPE +#define HGL_GRAPH_TEXTURE_TYPE +namespace hgl +{ + namespace graph + { + /** + * 纹理类型 + */ + enum class TextureType + { + None=0, + + Diffuse, + Specular, + Ambient, + Emissive, + Height, + Normals, + Shininess, + Opacity, + Displacement, + Lightmap, + Reflection, + AO, + + Albedo, + Metallic, + Rougness, + + BEGIN_REANGE=Diffuse, + END_RANGE=Rougness, + RANGE_SIZE=END_RANGE-BEGIN_REANGE+1 + };//enum class TextureType + }//namespace graph +}//namespace hgl +#endif//HGL_GRAPH_TEXTURE_TYPE diff --git a/res/model/vulkanlogo.assbin b/res/model/vulkanlogo.assbin new file mode 100644 index 0000000000000000000000000000000000000000..d7996424b1ff312dc61073601e454a4dee4a450a GIT binary patch literal 349204 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 SCv$dloySSb8J?3oGs$qaOl!OA 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 literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 862f9e1f..b246f65c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,3 +3,4 @@ add_subdirectory(Base) add_subdirectory(RenderDevice) add_subdirectory(SceneGraph) add_subdirectory(Platform) +add_subdirectory(Tools) diff --git a/src/Tools/CMakeLists.txt b/src/Tools/CMakeLists.txt new file mode 100644 index 00000000..38613186 --- /dev/null +++ b/src/Tools/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(ModelConvert) diff --git a/src/Tools/ModelConvert/AssimpLoader.cpp b/src/Tools/ModelConvert/AssimpLoader.cpp new file mode 100644 index 00000000..8a44a57c --- /dev/null +++ b/src/Tools/ModelConvert/AssimpLoader.cpp @@ -0,0 +1,761 @@ +#include"AssimpLoader.h" +#include +#include +#include +#include +#include +#include + +using namespace hgl; +using namespace hgl::graph; + +#define LOG_BR LOG_INFO(OS_TEXT("------------------------------------------------------------")); + +#define aisgl_min(x,y) (xx?y:x) + +void set_float4(float f[4], float a, float b, float c, float d) +{ + f[0] = a; + f[1] = b; + f[2] = c; + f[3] = d; +} + +void color4_to_float4(const aiColor4D *c, float f[4]) +{ + f[0] = c->r; + f[1] = c->g; + f[2] = c->b; + f[3] = c->a; +} + +void AssimpLoader::get_bounding_box_for_node (const aiNode* nd, + aiVector3D* min, + aiVector3D* max, + aiMatrix4x4* trafo) +{ + aiMatrix4x4 prev; + unsigned int n = 0, t; + + prev = *trafo; + aiMultiplyMatrix4(trafo,&nd->mTransformation); + + for (; n < nd->mNumMeshes; ++n) + { + const aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; + + for (t = 0; t < mesh->mNumVertices; ++t) + { + aiVector3D tmp = mesh->mVertices[t]; + aiTransformVecByMatrix4(&tmp,trafo); + + min->x = aisgl_min(min->x,tmp.x); + min->y = aisgl_min(min->y,tmp.y); + min->z = aisgl_min(min->z,tmp.z); + + max->x = aisgl_max(max->x,tmp.x); + max->y = aisgl_max(max->y,tmp.y); + max->z = aisgl_max(max->z,tmp.z); + } + } + + for (n = 0; n < nd->mNumChildren; ++n) + get_bounding_box_for_node(nd->mChildren[n],min,max,trafo); + + *trafo = prev; +} + +void AssimpLoader::get_bounding_box (const aiNode *node,aiVector3D* min, aiVector3D* max) +{ + aiMatrix4x4 trafo; + + aiIdentityMatrix4(&trafo); + + min->x = min->y = min->z = 1e10f; + max->x = max->y = max->z = -1e10f; + + get_bounding_box_for_node(node,min,max,&trafo); +} + +AssimpLoader::AssimpLoader() +{ + scene=0; + material_list=nullptr; +} + +AssimpLoader::~AssimpLoader() +{ + delete[] material_list; + + if(scene) + aiReleaseImport(scene); +} + +void AssimpLoader::SaveFile(const void *data,const uint &size,const OSString &ext_name) +{ + if(!data||size<=0)return; + + OSString filename=main_filename+OS_TEXT(".")+ext_name; + + if(filesystem::SaveMemoryToFile(filename,data,size)==size) + { + LOG_INFO(OS_TEXT("SaveFile: ")+filename+OS_TEXT(" , size: ")+OSString(size)); + + total_file_bytes+=size; + } +} + +void AssimpLoader::SaveFile(void **data,const int64 *size,const int &count,const OSString &ext_name) +{ + if(!data||size<=0)return; + + OSString filename=main_filename+OS_TEXT(".")+ext_name; + + int64 result=filesystem::SaveMemoryToFile(filename,data,size,count); + + if(result>0) + { + LOG_INFO(OS_TEXT("SaveFile: ")+filename+OS_TEXT(" , size: ")+OSString(result)); + + total_file_bytes+=result; + } +} + +void OutFloat3(const OSString &front,const Color4f &c) +{ + LOG_INFO(front+OS_TEXT(": ")+OSString(c.r) + +OS_TEXT("," )+OSString(c.g) + +OS_TEXT("," )+OSString(c.b)); +} + +constexpr VkSamplerAddressMode vk_wrap[4]= //对应aiTextureMapMode,注意最后一个其实不对 +{ + VK_SAMPLER_ADDRESS_MODE_REPEAT, + VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT, + VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE //这个是declas +}; + +void OutMaterialTexture(const MaterialTextureStruct &mt,io::DataOutputStream *dos) +{ + dos->WriteUint8(mt.type); + dos->WriteInt32(mt.tex_id); + dos->WriteUint8(mt.new_uvindex); + dos->WriteFloat(mt.blend); + dos->WriteUint8(mt.op); + dos->WriteUint8(mt.wrap_mode,2); + + LOG_INFO(OS_TEXT("\tTexture Type: ")+OSString(mt.type)); + LOG_INFO(OS_TEXT("\tTexture ID: ")+OSString(mt.tex_id)); + + LOG_INFO(OS_TEXT("\tuvindex: ")+OSString(mt.old_uvindex)); + LOG_INFO(OS_TEXT("\tblend: ")+OSString(mt.blend)); + LOG_INFO(OS_TEXT("\top: ")+OSString(mt.op)); + LOG_INFO(OS_TEXT("\twrap_mode: ")+OSString(mt.wrap_mode[0])+OS_TEXT(",")+OSString(mt.wrap_mode[1])); +} + +void OutMaterial(const MaterialStruct *ms,const OSString &filename) +{ + io::FileOutputStream fos; + io::LEDataOutputStream dos(&fos); + + fos.CreateTrunc(filename); + + dos.WriteFully("Material\x1A\x1",10); + dos.WriteFloat(ms->diffuse,3); + dos.WriteFloat(ms->specular,3); + dos.WriteFloat(ms->ambient,3); + dos.WriteFloat(ms->emission,3); + dos.WriteFloat(ms->shininess); + dos.WriteBool(ms->wireframe); + dos.WriteBool(ms->two_sided); + dos.WriteUint8(ms->tex_count); + + OutFloat3(OSString(OS_TEXT("diffuse")),ms->diffuse); + OutFloat3(OSString(OS_TEXT("specular")),ms->specular); + OutFloat3(OSString(OS_TEXT("ambient")),ms->ambient); + OutFloat3(OSString(OS_TEXT("emission")),ms->emission); + + LOG_INFO(OS_TEXT("shininess: ")+OSString(ms->shininess)); + + LOG_INFO(OS_TEXT("wireframe: ")+OSString(ms->wireframe?OS_TEXT("true"):OS_TEXT("false"))); + LOG_INFO(OS_TEXT("two_sided: ")+OSString(ms->two_sided?OS_TEXT("true"):OS_TEXT("false"))); + + LOG_INFO(OS_TEXT("Material Texture Count ")+OSString(ms->tex_count)); + + for(int i=0;itex_count;i++) + OutMaterialTexture(ms->tex_list[i],&dos); + + fos.Close(); +} + +void AssimpLoader::LoadMaterial() +{ + if(!scene->HasMaterials())return; + + int ret1, ret2; + float c[4]; + aiColor4D diffuse; + aiColor4D specular; + aiColor4D ambient; + aiColor4D emission; + float shininess; + float strength; + int two_sided; + int wireframe; + unsigned int max; // changed: to unsigned + + LOG_BR; + LOG_INFO(OS_TEXT("Material Count ")+OSString(scene->mNumMaterials)); + LOG_BR; + + aiString filename; + aiTextureMapping tm; + uint uvindex=0; + float blend; + aiTextureOp op; + aiTextureMapMode wrap_mode[2]; + + material_count=scene->mNumMaterials; + + material_list=new MaterialStruct[material_count]; + + for(unsigned int m=0;mmNumMaterials;m++) + { + int tex_index=0; + int tex_count=0; + int tt_count=0; + int32 tex_id; + aiReturn found=AI_SUCCESS; + + aiMaterial *mtl=scene->mMaterials[m]; + + for(uint tt=aiTextureType_DIFFUSE;ttGetTextureCount((aiTextureType)tt); + } + + MaterialStruct *ms=&(material_list[m]); + + ms->Init(tex_count); + + for(uint tt=aiTextureType_DIFFUSE;ttGetTextureCount((aiTextureType)tt); + + for(int t=0;tGetTexture((aiTextureType)tt,t,&filename,&tm,&uvindex,&blend,&op,wrap_mode); + + ms->tex_list[tex_index].type=tt; + + ms->uv_use.Add(uvindex); + + { + char *fn=strrchr(filename.data,'\\'); + char *ext; + + if(!fn) + fn=strrchr(filename.data,'/'); + else + ++fn; + + if(fn) + ++fn; + else + fn=filename.data; + + ext=strrchr(fn,'.'); + + if(ext)*ext=0; + + #if HGL_OS == HGL_OS_Window + tex_id=tex_list.CaseFind(fn); + #else + tex_id=tex_list.Find(fn); + #endif// + + if(tex_id==-1) + tex_id=tex_list.Add(fn); + + ms->tex_list[tex_index].tex_id=tex_id; + } + + ms->tex_list[tex_index].old_uvindex=uvindex; + ms->tex_list[tex_index].blend=blend; + ms->tex_list[tex_index].op=op; + + ms->tex_list[tex_index].wrap_mode[0]=vk_wrap[wrap_mode[0]]; + ms->tex_list[tex_index].wrap_mode[1]=vk_wrap[wrap_mode[1]]; + + ++tex_index; + } + } + + ms->ProcUVIndex(); + + set_float4(c, 0.8f, 0.8f, 0.8f, 1.0f); + if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_DIFFUSE, &diffuse)) + color4_to_float4(&diffuse, c); + //glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, c); + ms->diffuse.Set(c); + + set_float4(c, 0.0f, 0.0f, 0.0f, 1.0f); + if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_SPECULAR, &specular)) + color4_to_float4(&specular, c); + //glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, c); + ms->specular.Set(c); + + set_float4(c, 0.2f, 0.2f, 0.2f, 1.0f); + if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_AMBIENT, &ambient)) + color4_to_float4(&ambient, c); + //glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, c); + ms->ambient.Set(c); + + set_float4(c, 0.0f, 0.0f, 0.0f, 1.0f); + if(AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_EMISSIVE, &emission)) + color4_to_float4(&emission, c); + //glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, c); + ms->emission.Set(c); + + max = 1; + ret1 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS, &shininess, &max); + max = 1; + ret2 = aiGetMaterialFloatArray(mtl, AI_MATKEY_SHININESS_STRENGTH, &strength, &max); + + if((ret1 == AI_SUCCESS) && (ret2 == AI_SUCCESS)) + { + //glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess * strength); + + ms->shininess=shininess*strength; + } + else + { + //glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0f); + ms->shininess=0; + + set_float4(c, 0.0f, 0.0f, 0.0f, 0.0f); + //glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, c); + + ms->specular.Zero(); + } + + max = 1; + if(aiGetMaterialIntegerArray(mtl, AI_MATKEY_ENABLE_WIREFRAME, &wireframe, &max)==AI_SUCCESS) + ms->wireframe=wireframe; + else + ms->wireframe=false; + + max = 1; + if(aiGetMaterialIntegerArray(mtl, AI_MATKEY_TWOSIDED, &two_sided, &max)==AI_SUCCESS) + ms->two_sided=two_sided; + else + ms->two_sided=true; + + OutMaterial(ms,main_filename+OS_TEXT(".")+OSString(m)+OS_TEXT(".material")); + LOG_BR; + } +} + +void AssimpLoader::SaveTextures() +{ + const int tex_count=tex_list.GetCount(); + + LOG_INFO(OS_TEXT("TOTAL Texture Count: ")+OSString(tex_count)); + + if(tex_count<=0) + return; + + for(int i=0;i +void AssimpLoader::SaveFaces(io::FileOutputStream *fos,const aiFace *face,const T count) +{ + T *data=new T[count*3]; + + const aiFace *sp=face; + T *tp=data; + + for(T i=0;imIndices[0];++tp; + *tp=sp->mIndices[1];++tp; + *tp=sp->mIndices[2];++tp; + + ++sp; + } + + fos->WriteFully(data,sizeof(T)*3*count); + + delete[] data; +} + +void AssimpLoader::SaveTexCoord(float *tp,const aiVector3D *texcoord,const uint comp,const uint count) +{ + if(comp<=0||comp>3) + return; + + const uint size=1+sizeof(float)*comp*count; + + const aiVector3D *sp=texcoord; + + if(comp==1) + { + for(uint i=0;ix;++tp; + ++sp; + } + } + else + if(comp==2) + { + for(uint i=0;ix;++tp; + *tp=sp->y;++tp; + ++sp; + } + } + else + if(comp==3) + { + for(uint i=0;ix;++tp; + *tp=sp->y;++tp; + *tp=sp->z;++tp; + ++sp; + } + } +} + +void c4f_to_4b(uint8 *tp,const aiColor4D *c4,const int count) +{ + for(int i=0;ir*255;++tp; + *tp=c4->g*255;++tp; + *tp=c4->b*255;++tp; + *tp=c4->a*255;++tp; + } +} + +void AxisY2Z(aiVector3D *v,const uint32 count) +{ + ai_real t; + + for(uint32 i=0;iy; + v->y=-(v->z); + v->z=t; + + ++v; + } +} + +void AssimpLoader::LoadMesh() +{ + if(!scene->HasMeshes())return; + + UTF8String mesh_name; + + total_file_bytes=0; + + LOG_BR; + LOG_INFO(OS_TEXT("Mesh Count ")+OSString(scene->mNumMeshes)); + + uint vertex_total=0; + uint tri_total=0; + uint bone_total=0; + + for(unsigned int i=0;imNumMeshes;i++) + { + const aiMesh *mesh=scene->mMeshes[i]; + + const uint v3fdata_size=mesh->mNumVertices*3*sizeof(float); + const uint v4fdata_size=mesh->mNumVertices*4*sizeof(float); + + if(mesh->mName.length) + mesh_name=U8_TEXT("Mesh [")+UTF8String(i)+U8_TEXT(":")+UTF8String(mesh->mName.C_Str())+U8_TEXT("]"); + else + mesh_name=U8_TEXT("Mesh [")+UTF8String(i)+U8_TEXT("]"); + + int pn=mesh->mFaces[0].mNumIndices; + + LOG_BR; + + LOG_INFO(mesh_name+U8_TEXT(" PrimitiveTypes is ")+UTF8String(mesh->mPrimitiveTypes)); + + LOG_INFO(mesh_name+U8_TEXT(" vertex color count is ")+UTF8String(mesh->GetNumColorChannels())); + LOG_INFO(mesh_name+U8_TEXT(" texcoord count is ")+UTF8String(mesh->GetNumUVChannels())); + + if(mesh->GetNumUVChannels()>0) + LOG_INFO(mesh_name+U8_TEXT(" Material Index is ")+UTF8String(mesh->mMaterialIndex)); + + if(mesh->HasPositions())LOG_INFO(mesh_name+U8_TEXT(" have Position, vertices count ")+UTF8String(mesh->mNumVertices)); + if(mesh->HasFaces())LOG_INFO(mesh_name+U8_TEXT(" have Faces,faces count ")+UTF8String(mesh->mNumFaces)); + if(mesh->HasNormals())LOG_INFO(mesh_name+U8_TEXT(" have Normals")); + if(mesh->HasTangentsAndBitangents())LOG_INFO(mesh_name+U8_TEXT(" have Tangent & Bitangents")); + if(mesh->HasBones())LOG_INFO(mesh_name+U8_TEXT(" have Bones, Bones Count ")+UTF8String(mesh->mNumBones)); + + vertex_total+=mesh->mNumVertices; + tri_total+=mesh->mNumFaces; + bone_total+=mesh->mNumBones; + + LOG_INFO(mesh_name+U8_TEXT(" PN is ")+UTF8String(pn)); + + if(pn!=3) + continue; + + MaterialStruct *mtl=&(material_list[mesh->mMaterialIndex]); + + const uint uv_channels=mtl->uv_use.GetCount(); + + LOG_INFO(mesh_name+U8_TEXT(" use UV Channels is ")+UTF8String(uv_channels)); + + io::FileOutputStream fos; + + OSString mesh_filename=main_filename+OS_TEXT(".")+OSString(i)+OS_TEXT(".mesh"); + + if(!fos.CreateTrunc(mesh_filename)) + { + LOG_INFO(OS_TEXT("Create Mesh file Failed,filename: ")+mesh_filename); + continue; + } + + { + MeshStruct ms; + + ms.primitive_type =PRIM_TRIANGLES; + ms.vertices_number =mesh->mNumVertices; + ms.faces_number =mesh->mNumFaces; + ms.color_channels =mesh->GetNumColorChannels(); + ms.texcoord_channels=uv_channels; + ms.material_index =mesh->mMaterialIndex; + + if(mesh->HasNormals()) + { + if(mesh->HasTangentsAndBitangents()) + ms.ntb=NTB_BIT_ALL; + else + ms.ntb=NTB_BIT_NORMAL; + } + + ms.bones_number =mesh->mNumBones; + + fos.WriteFully(&ms,sizeof(MeshStruct)); + } + + if(mesh->HasPositions()) + { + AxisY2Z(mesh->mVertices,mesh->mNumVertices); + fos.WriteFully(mesh->mVertices,v3fdata_size); + } + + if(mesh->HasNormals()) + { + AxisY2Z(mesh->mNormals,mesh->mNumVertices); + fos.WriteFully(mesh->mNormals,v3fdata_size); + + if(mesh->HasTangentsAndBitangents()) + { + AxisY2Z(mesh->mTangents,mesh->mNumVertices); + AxisY2Z(mesh->mBitangents,mesh->mNumVertices); + + fos.WriteFully(mesh->mTangents,v3fdata_size); + fos.WriteFully(mesh->mBitangents,v3fdata_size); + } + } + + if(mesh->GetNumColorChannels()>0) + { + const int64 vertex_color_size=mesh->mNumVertices*4*mesh->GetNumColorChannels(); + + uint8 *vertex_color=new uint8[vertex_color_size]; + uint8 *tp=vertex_color; + + for(int c=0;cGetNumColorChannels();c++) + { + c4f_to_4b(tp,mesh->mColors[c],mesh->mNumVertices); + tp+=mesh->mNumVertices*4; + } + + fos.WriteFully(vertex_color,vertex_color_size); + + delete[] vertex_color; + } + + if(mtl->uv_use.GetCount()>0 + &&mesh->GetNumUVChannels()) + { + int tc=0; + int comp_total=0; + int *uv_use=mtl->uv_use.GetData(); + + //这里要重新审视数据来源,并不是每一个纹理通道都有数据,并且和材质对应。 + //、、材质中的uv index具体对应啥 还不是很清楚 + + for(int c=0;c=mesh->GetNumUVChannels()) + uv_use[c]=0; + + comp_total+=mesh->mNumUVComponents[uv_use[c]]; + } + + comp_total*=mesh->mNumVertices; + + uint64 tc_size=mesh->GetNumUVChannels()+comp_total*sizeof(float); + + uint8 *tc_data=new uint8[tc_size]; + float *tp=(float *)(tc_data+mesh->GetNumUVChannels()); + for(int c=0;cmNumUVComponents[uv_use[c]]; + + SaveTexCoord(tp,mesh->mTextureCoords[c],mesh->mNumUVComponents[c],mesh->mNumVertices); + + tp+=mesh->mNumUVComponents[c]*mesh->mNumVertices; + } + + fos.WriteFully(tc_data,tc_size); + + delete[] tc_data; + } + + if(mesh->HasFaces()) + { + if(mesh->mNumVertices>0xFFFF) + SaveFaces(&fos,mesh->mFaces,mesh->mNumFaces); + else + SaveFaces(&fos,mesh->mFaces,mesh->mNumFaces); + } + + fos.Close(); + } + + LOG_BR; + LOG_INFO(OS_TEXT("TOTAL Vertices Count ")+OSString(vertex_total)); + LOG_INFO(OS_TEXT("TOTAL Faces Count ")+OSString(tri_total)); + LOG_INFO(OS_TEXT("TOTAL Bones Count ")+OSString(bone_total)); + + LOG_INFO(OS_TEXT("TOTAL File Size ")+OSString(total_file_bytes)); + LOG_BR; +} + +void AssimpLoader::LoadScene(const UTF8String &front,io::DataOutputStream *dos,const aiNode *nd) +{ + aiVector3D bb_min,bb_max; + float box[6]; + get_bounding_box(nd,&bb_min,&bb_max); + + box[0]=bb_min.x;box[1]=bb_min.y;box[2]=bb_min.z; + box[3]=bb_max.x;box[4]=bb_max.y;box[5]=bb_max.z; + + dos->WriteUTF8String(nd->mName.C_Str()); + dos->WriteFloat(box,6); + + dos->WriteFloat((float *)&(nd->mTransformation),16); + + dos->WriteUint32(nd->mNumMeshes); + + LOG_INFO(front+U8_TEXT("Node[")+UTF8String(nd->mName.C_Str())+U8_TEXT("][Mesh:")+UTF8String(nd->mNumMeshes)+U8_TEXT("][SubNode:")+UTF8String(nd->mNumChildren)+U8_TEXT("]")) + + const UTF8String new_front=U8_TEXT(" ")+front; + + if(nd->mNumMeshes>0) + { + dos->WriteUint32(nd->mMeshes,nd->mNumMeshes); + + for(unsigned int i=0;imNumMeshes;i++) + { + const aiMesh *mesh=scene->mMeshes[nd->mMeshes[i]]; + + LOG_INFO(new_front+U8_TEXT("Mesh[")+UTF8String(i)+U8_TEXT("] ")+UTF8String(mesh->mName.C_Str())); + } + } + + dos->WriteUint32(nd->mNumChildren); + + for(unsigned int n=0;nmNumChildren;++n) + LoadScene(new_front,dos,nd->mChildren[n]); +} + +bool AssimpLoader::LoadFile(const OSString &filename) +{ + uint filesize; + char *filedata; + + filesize=filesystem::LoadFileToMemory(filename,(void **)&filedata); + + if(!filedata) + return(false); + +#ifdef _WIN32 + const UTF8String ext_name=ToUTF8String(filesystem::ClipFileExtName(filename)); +#else + const UTF8String ext_name=filesystem::ClipFileExtName(filename); +#endif// + + scene=aiImportFileFromMemory(filedata,filesize,aiProcessPreset_TargetRealtime_Quality|aiProcess_FlipUVs,ext_name.c_str()); + + delete[] filedata; + + if(!scene) + return(false); + + filename.SubString(main_filename,0,filename.FindRightChar(OS_TEXT('.'))); + + get_bounding_box(scene->mRootNode,&scene_min,&scene_max); + + scene_center.x = (scene_min.x + scene_max.x) / 2.0f; + scene_center.y = (scene_min.y + scene_max.y) / 2.0f; + scene_center.z = (scene_min.z + scene_max.z) / 2.0f; + + //这个顺序是假设了所有的材质和模型都有被使用 + //aiProcessPreset_TargetRealtime_Quality已经指定了会删除多余材质,所以这里不用处理。 + //但多余模型并不确定是否存在 + + io::FileOutputStream fos; + io::LEDataOutputStream dos(&fos); + + OSString scene_filename=main_filename+OS_TEXT(".scene"); + + if(!fos.CreateTrunc(scene_filename)) + { + LOG_INFO(OS_TEXT("Create Scene file Failed,filename: ")+scene_filename); + return(false); + } + + dos.WriteFully("SCENE\x1a\x01",7); + + dos.WriteUint32(scene->mNumMaterials); + dos.WriteUint32(scene->mNumMeshes); + + LoadMaterial(); //载入所有材质 + + dos.WriteUint32(tex_list.GetCount()); + + LoadMesh(); //载入所有mesh + LoadScene(UTF8String(""),&dos,scene->mRootNode); //载入场景节点 + + fos.Close(); + + SaveTextures(); + + return(true); +} diff --git a/src/Tools/ModelConvert/AssimpLoader.h b/src/Tools/ModelConvert/AssimpLoader.h new file mode 100644 index 00000000..6a91d7bb --- /dev/null +++ b/src/Tools/ModelConvert/AssimpLoader.h @@ -0,0 +1,159 @@ +#ifndef HGL_TOOL_MODEL_CONVERT_ASSIMP_LOADER_INCLUDE +#define HGL_TOOL_MODEL_CONVERT_ASSIMP_LOADER_INCLUDE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace hgl; +using namespace hgl::graph; + +#pragma pack(push,1) + +struct MaterialTextureStruct +{ + uint8 type=0; + + int32 tex_id=-1; + + uint32 old_uvindex=0; + uint32 new_uvindex=0; + float blend=0; + uint8 op=0; + uint8 wrap_mode[2]={0,0}; +};// + +struct MaterialStruct +{ + uint32 tex_count; + + MaterialTextureStruct *tex_list; + + Set uv_use; + + Color4f diffuse; + Color4f specular; + Color4f ambient; + Color4f emission; + + float shininess=0; + + bool wireframe=false; + bool two_sided=false; + +public: + + MaterialStruct() + { + tex_count=0; + tex_list=nullptr; + } + + void Init(const uint32 tc) + { + tex_count=tc; + + tex_list=new MaterialTextureStruct[tc]; + } + + ~MaterialStruct() + { + delete[] tex_list; + } + + void ProcUVIndex() + { + for(uint i=0;i + void SaveFaces(io::FileOutputStream *,const aiFace *,const T); + + void SaveTexCoord(float *,const aiVector3D *,const uint,const uint); + +public: + + AssimpLoader(); + ~AssimpLoader(); + + bool LoadFile(const OSString &); + bool SaveFile(const OSString &); +};//class AssimpLoader +#endif//HGL_TOOL_MODEL_CONVERT_ASSIMP_LOADER_INCLUDE diff --git a/src/Tools/ModelConvert/CMakeLists.txt b/src/Tools/ModelConvert/CMakeLists.txt new file mode 100644 index 00000000..12556dff --- /dev/null +++ b/src/Tools/ModelConvert/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(ModelConvert MainUnit.cpp AssimpLoader.cpp AssimpLoader.h) + +target_link_libraries(ModelConvert ${ULRE} + assimp + IrrXML + zlibstatic) diff --git a/src/Tools/ModelConvert/MainUnit.cpp b/src/Tools/ModelConvert/MainUnit.cpp new file mode 100644 index 00000000..1a60c2fc --- /dev/null +++ b/src/Tools/ModelConvert/MainUnit.cpp @@ -0,0 +1,35 @@ +#include +#include"AssimpLoader.h" + +using namespace hgl; +using namespace hgl::graph; +using namespace VK_NAMESPACE; + +#ifdef _WIN32 +int wmain(int argc,wchar_t **argv) +#else +int main(int argc,char **argv) +#endif// +{ + std::cout<<"Model Convert 1.01"<"<