[DLL] DLL Interface

2021. 12. 19. 03:02·DLL

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
'DLL' 카테고리의 다른 글
  • [DLL] Implicit Linking DLL / Explicit Linking DLL
KyuHwang
KyuHwang
  • KyuHwang
    DirectX Engine
    KyuHwang
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • C++ (4)
      • CS (0)
      • Graphics (32)
      • DLL (2)
      • Shader (7)
      • Project (4)
      • ETC (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • YouTube
  • 공지사항

  • 인기 글

  • 태그

    shader
    RunTime Compile Shader
    Hash Code
    animation constraint
    texture block compression
    Implicit Linking
    Shader Macro
    Order Independent Transparency
    hlsl
    Directx11
    DirectX 2D
    Define Function
    animation retargeting
    dll
    nvtt
    mobile format
    std::enable_if
    Alpha Blending
    Project
    C ++
    Explicit Linking
    Define Macro
    Win API
    Shader Reflection
    bc format
    std::is_base_of
    DLL Interface
    Shader Resource 관리
    rigging chain
    Return Type Operator
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
KyuHwang
[DLL] DLL Interface
상단으로

티스토리툴바