DLL Interface
Interface를 통한 DLL 배포 방식
- Interface는 순수 가상 함수들로만 이루어진 최상위 Class 라고 보면된다. 해당 Interface Class를 상속받아 실질적인
배포를 할 Class의 내부는 숨길 수 있다는 장점과, 해당 Interface를 통해 여러가지 버전의 Library를 제공 할 수 있다는
장점이 있다.
Interface를 통한 배포방식의 장점
- 먼저 이전 방식에선 해당 DLL Header의 namespace로 기능별로 묶어 제공을 하였는데, 이렇게 되면 해당 Class를
반환해서 사용하려면 내보내야 하는 것들이 너무 많아져 불편하다. 하지만 Interface를 통해 전역으로 생성해주는
함수를 통해 해당 Class를 반환해 준다면 이런 문제들이 사라진다. 예를들어 배포하려는 Class 내부에 다른
Class의 멤버 변수가 있을 경우 해당 DLL을 사용하기 위해 DLL Header 뿐만 아니라 해당 Class에 해당하는 Header도
같이 동봉을 해야하는 불편함이 있지만, Interface를 통해서 배포를 하게되면 이런 문제들이 사라진다.
- Interface를 통한 배포를 하게 되면 버전관리가 편하다. 일단 해당 버전에 맞는 생성 함수만 있다면 우리가 배포할때
동봉해야 하는 Header는 DLL Header 하나로면 충분하다. 예를들어 다른 Library를 사용한 Library를 배포를 하려할 때,
해당 Library를 사용하기 위한 Header를 동봉할 필요 없이 해당 Library의 DLL만 동봉해 준다면 사용할 수 있기
때문이다.
class ModelParser
{
public:
ModelParser() = default;
virtual ~ModelParser() = default;
public:
// Create 함수를 통해 ModelParser 생성..
static PARSER_DLL ModelParser* Create(MODEL_TYPE type);
// 기본 Texture 경로 설정 함수..
static PARSER_DLL void SetTextureRoute(std::string texRoute);
protected:
static std::string g_TextureRoute;
public:
// 기본적인 초기화 함수..
virtual PARSER_DLL void Initialize() abstract;
// Model Data 해제 함수..
virtual PARSER_DLL void Release() abstract;
// Model Load 함수..
virtual PARSER_DLL ParserData::Model* LoadModel(std::string fileName) { return nullptr; }
virtual PARSER_DLL ParserData::Model* LoadModel(std::string fileName, UINT state) { return nullptr; }
};
위의 DLL Header를 통해 ASE, FBX Parser를 사용자가 원하는데로 사용 할 수 있다.
class FBXParser : public ModelParser
{
public:
FBXParser() = default;
~FBXParser() = default;
public:
void Initialize() override;
void Release() override;
ParserData::Model* LoadModel(std::string fileName, UINT state) override;
void SceneSetting(std::string fileName);
void CreateModel();
void ResetData();
void LoadMaterial();
void LoadNode(fbxsdk::FbxNode* node, fbxsdk::FbxNodeAttribute::EType attribute);
void LoadAnimation(fbxsdk::FbxNode* node);
void ProcessSkeleton(fbxsdk::FbxNode* node);
void ProcessMesh(fbxsdk::FbxNode* node);
bool ProcessBoneWeights(fbxsdk::FbxNode* node, std::vector<BoneWeights>& meshBoneWeights);
void ProcessAnimation(fbxsdk::FbxNode* node);
void OptimizeData();
void OptimizeVertex(ParserData::Mesh* pMesh);
void CopyOriginalVertex(ParserData::Mesh* pMesh);
void RecombinationTM(ParserData::Mesh* pMesh);
DirectX::SimpleMath::Vector2 ConvertVector2(fbxsdk::FbxVector2 v2);
DirectX::SimpleMath::Vector2 ConvertVector2(fbxsdk::FbxVector4 v4);
DirectX::SimpleMath::Vector3 ConvertVector3(fbxsdk::FbxVector4 v4);
DirectX::SimpleMath::Vector4 ConvertVector4(fbxsdk::FbxVector4 v4);
DirectX::SimpleMath::Matrix ConvertMatrix(fbxsdk::FbxMatrix matrix);
std::string ConvertFileRoute(const char* fileName);
DirectX::SimpleMath::Vector3 GetPos(fbxsdk::FbxMesh* mesh, int vertexIndex);
DirectX::SimpleMath::Vector3 GetNormal(fbxsdk::FbxMesh* mesh, int vertexIndex, int vertexCount);
DirectX::SimpleMath::Vector2 GetUV(fbxsdk::FbxMesh* mesh, int vertexIndex, int uvIndex);
void LinkMaterialByPolygon(fbxsdk::FbxMesh* mesh, int polygonIndex, int vertexIndex);
void SetTransform(fbxsdk::FbxNode* node);
int GetMaterialIndex(fbxsdk::FbxSurfaceMaterial* material);
void SetMaterial(fbxsdk::FbxSurfaceMaterial* material);
void SetTexture(fbxsdk::FbxSurfaceMaterial* material, const char* materialName);
void CreateVertex(fbxsdk::FbxMesh* mesh, std::vector<BoneWeights>& boneWeights, int vertexCount);
void CreateMesh();
int FindBoneIndex(std::string boneName);
ParserData::Mesh* FindMesh(std::string meshName);
private:
fbxsdk::FbxManager* pManager;
fbxsdk::FbxImporter* pImporter;
fbxsdk::FbxScene* pScene;
fbxsdk::FbxGeometryConverter* pConverter;
fbxsdk::FbxMesh* pMesh;
std::string fbxFileName;
std::vector<fbxsdk::FbxSurfaceMaterial*> fbxMaterials;
private:
ParserData::Model* m_Model;
std::vector<ParserData::Model*> m_ModelList;
ParserData::CMaterial* m_MaterialData; // Material Data Struct
ParserData::Mesh* m_OneMesh; // Mesh Data Struct
std::vector<ParserData::Mesh*> m_AllBoneList; // Skinning Object Bone List
ParserData::OneAnimation* m_OneAnimation; // Object One Animation Data
int m_KeyFrames; // Animation Total Frame
int m_StartTime; // Animation Start Frame
float m_TickFrame; // One Frame Time
UINT m_ParsingMode = 0;
};
class ASEParser : public ModelParser
{
public:
ASEParser();
~ASEParser();
public:
void Initialize() override;
void Release() override;
ParserData::Model* LoadModel(std::string fileName) override;
void OptimizeVertex(ParserData::ASEMesh* pMesh); // 버텍스(노말), 텍스쳐 값으로 최적화를 해 준다.
void RecombinationTM(ParserData::ASEMesh* pMesh);
void OptimizeData();
void SetBoneTM(ParserData::ASEMesh* pMesh);
void CreateModel();
void ResetData();
private:
ParserData::Model* m_Model;
std::vector<ParserData::Model*> m_ModelList;
private:
// 토큰을 구별해내기 위한 스트링
char m_TokenString[256];
private:
ParserData::Scenedata m_scenedata; // 현재 Scene의 데이터가 들어갈 구조체
/// 매트리얼 관련
ParserData::CMaterial* m_MaterialData; // Material의 데이터가 들어갈 구조체
ParserData::MaterialMap* m_materialmap;
std::vector<ParserData::CMaterial*> m_MaterialList; // Material들의 리스트
/// 한 씬에 N개의 메시가 존재할 수 있다.
ParserData::ASEMesh* m_OneMesh; // 메시 하나의 데이터가 들어갈 구조체
std::vector<ParserData::ASEMesh*> m_MeshList; // 메시들
ParserData::Bone* m_Bone;
/// 애니메이션
bool m_IsAnimation;
ParserData::OneAnimation* m_Animation; // 한 오브젝트의 애니메이션 데이터(파싱용)
std::string m_TexRoute;
private:
ASE::CASELexer* m_lexer;
private:
/// 파싱을 맡게 되는 비재귀함수.
void DataParsing();
int Parsing_NumberLong(); // long
float Parsing_NumberFloat(); // float
LPSTR Parsing_String(); // string
int Parsing_NumberInt(); // int
DirectX::SimpleMath::Vector3 Parsing_ChangeNumberVector3(); // Float3 -> Vector3
void Create_OneMesh_to_list(); // Create New MEsh
void Create_MaterialData_to_list(); // Create New Material
void Create_DiffuseMap_to_list(); // Material DiffuseMap Data
void Create_BumpMap_to_list(); // Material BumpMap Data
void Create_SpecularMap_to_list(); // Material SpecularMap Data
void Create_ShineMap_to_list(); // Material ShineMap Data
void Create_AnimationData_to_mesh(ParserData::Mesh* nowMesh);
void Create_BoneData_to_list();
};
DLL Interface를 상속받은 실질적인 구현 Class 선언부.
'DLL' 카테고리의 다른 글
[DLL] Implicit Linking DLL / Explicit Linking DLL (0) | 2021.12.19 |
---|