#pragma once #include #include #include #include namespace BMap { class BMGroup { public: BMGroup(LibCmo::CK2::ObjImpls::CKGroup* ptr); ~BMGroup(); LIBCMO_DEFAULT_COPY_MOVE(BMGroup); LibCmo::CK2::ObjImpls::CKGroup* m_NativePtr; }; class BMTexture { public: BMTexture(LibCmo::CK2::ObjImpls::CKTexture* ptr); ~BMTexture(); LIBCMO_DEFAULT_COPY_MOVE(BMTexture); LibCmo::CK2::ObjImpls::CKTexture* m_NativePtr; }; class BMMaterial { public: BMMaterial(LibCmo::CK2::ObjImpls::CKMaterial* ptr); ~BMMaterial(); LIBCMO_DEFAULT_COPY_MOVE(BMMaterial); LibCmo::CK2::ObjImpls::CKMaterial* m_NativePtr; }; class BMMesh { public: BMMesh(LibCmo::CK2::ObjImpls::CKMesh* ptr); ~BMMesh(); LIBCMO_DEFAULT_COPY_MOVE(BMMesh); LibCmo::CK2::ObjImpls::CKMesh* m_NativePtr; }; class BM3dEntity { public: BM3dEntity(LibCmo::CK2::ObjImpls::CK3dEntity* ptr); ~BM3dEntity(); LIBCMO_DEFAULT_COPY_MOVE(BM3dEntity); LibCmo::CK2::ObjImpls::CK3dEntity* m_NativePtr; }; class BMMeshTransition { private: struct TransitionVertex { TransitionVertex( const LibCmo::VxMath::VxVector3& vec, const LibCmo::VxMath::VxVector3& norm, const LibCmo::VxMath::VxVector2& uv); LibCmo::VxMath::VxVector3 m_Vertex; LibCmo::VxMath::VxVector3 m_Norm; LibCmo::VxMath::VxVector2 m_UV; }; struct TransitionFace { TransitionFace(uint32_t _i1, uint32_t _i2, uint32_t _i3, uint32_t mtl_id); uint32_t m_Idx1, m_Idx2, m_Idx3; uint32_t m_MtlSlotIdx; }; struct TransitionVertexCompare { bool operator()(const TransitionVertex& lhs, const TransitionVertex& rhs) const; }; public: BMMeshTransition(); ~BMMeshTransition(); void PrepareVertexCount(uint32_t count); void PrepareVertex(uint32_t index, float x, float y, float z); void PrepareNormalCount(uint32_t count); void PrepareNormal(uint32_t index, float x, float y, float z); void PrepareUVCount(uint32_t count); void PrepareUV(uint32_t index, float u, float v); void PrepareMtlSlotCount(uint32_t count); void PrepareMtlSlot(uint32_t index, BMMaterial* mtl); void PrepareFaceCount(uint32_t count); void PrepareFaceVertexIndices(uint32_t index, uint32_t indice1, uint32_t indice2, uint32_t indice3); void PrepareFaceNormalIndices(uint32_t index, uint32_t indice1, uint32_t indice2, uint32_t indice3); void PrepareFaceUVIndices(uint32_t index, uint32_t indice1, uint32_t indice2, uint32_t indice3); void PrepareFaceMtlSlot(uint32_t index, uint32_t mtl_slot); bool Parse(BMMesh* write_into_mesh); private: void DoRealParse(); void ApplyToMesh(BMMesh* write_into_mesh); bool m_IsVertexOK, m_IsNormalOK, m_IsUVOK, m_IsFaceOK, m_IsMtlSlotOK; bool m_IsParsed; std::vector m_Vertexs, m_Normals; std::vector m_UVs; std::vector m_FaceVertexs, m_FaceNormals, m_FaceUVs; std::vector m_FaceMtlSlotIdxs; std::vector m_MtlSlots; std::vector m_ProcVertexs; std::vector m_ProcFaces; // unordered_map have performance problem when dealing with massive data (in this case, big mesh) // so we use map to get stable time cost. std::map m_ProcDupRemover; }; class BMFile { public: BMFile(); ~BMFile(); private: LibCmo::CK2::CKContext* m_Context; std::vector m_ObjGroups; std::vector m_Obj3dObjects; std::vector m_ObjMeshs; std::vector m_ObjMaterials; std::vector m_ObjTextures; }; }