흐름
- Mesh_Dynamic의 Create->Native_Prototype호출
szFullpath에 인자로 받은 경로를 붙임
하이어라키로더를 만들고 D3DXLoadMeshHierachyFromX함수호출
(내가만든 하이어라키로더로 데이터를 읽어오고 루트프레임에 저장해줌)
- D3DXLoadMeshHierachyFromX
먼저 CreateFrame함수를 통해 프레임을 만듬
여기서 원하는 LPD3DXFRAME을 상속받아 원하는 구조체로 데이터를 불러올수있다.
나는 CombinedTransformationMatrix를 사용해서 루트부터 누적된 이동행렬을 가지게함 이를 곱하면 진짜위치를 구할수있다.
먼저 읽어온 Name을 Allocate_Name()함수로 pFrame->Name에저장
pFrame->TransformationMatrix와 CombinedTransformationMatrix를 항등행렬로 초기화
이제 생성한 pFrame을 인풋 ppNewFrame을 통해 전달해줌
CreateMeshContainer함수로 메시컨테이너의 값을채워넣어줘야함 Frame과 동일하게 상속받은 구조체로 자유롭게 구조체에 데이터를 추가가능
추가할데이터
텍스처배열가리키는 포인터 ppMaterialTextures
Transform을 곱할때 원본을 계속 가지고있게하기위한
LPD3DXMESH pOriginalMesh
뼈의갯수 iNumBones
SkinInfo에 저장되어있는 초기위치 pOffsetMatrices
오프셋과 컴바인을 곱하여 저장한 렌더링매트릭스 pRenderingMatrices
프레임의 컴바인 행렬을 가리키는 더블포인터 ppCombindTranformationMatrices 포인터가 아니라 더블포인터인 이유는 초기에 한번 주소값을 넣어넣고 값을 가져다쓸것이기 때문이다.
1번 인자 LPCSTR Name
다음 우선 Allocate_Name으로 pMeshContainer->Name을 넣어준다.
2번 인자 const D3DXMESHDATA* pMeshData
그 다음 D3DVERTEXELEMENT9 Element[MAX_FVF_DECL_SIZE];을 이용해 정점의 FVF를 대용한다. 이를 사용하면 이점은 탄젠트,바이노말같은 FVF에선 정의되어있지않은 값을 사용할수있다.
pMeshData->pMesh->GetDeclaration(Element);
를 통해 현재 메시의 정보를 Element에 저장하고 추가하고싶은 데이터를 추가할수있다.
pMeshData->pMesh->CloneMesh(옵션,엘리먼트,장치,&pMeshContainer->MeshData.pMesh)
를 호출해 메시컨테이너의 메시데이터의 복사해서 저장한다.
pMeshContainer->MeshData.Type = D3DXMESHTYPE_MESH;
로 pMesh를 사용했음을 정의한다.
5번 인자 NumMaterials
pMeshContainer->NumMaterials = NumMaterials;
받은 인자 그대로 넣어준다.
다음 텍스처를 2차원 배열의 형태로 저장한다
pMeshContainer->ppMaterialTextures = new MESHMATERIALTEXTURE*[NumMaterials];
for (_uint i = 0; i < NumMaterials; i++)
{
pMeshContainer->ppMaterialTextures[i] = new MESHMATERIALTEXTURE;
}
를 통해 머테리얼의 수만큼 동적할당 해주자.
다음 재질의 수만큼 pTextureFilename를 pMaterials로부터 받아서 &pMeshContainer->ppMaterialTextures[i]->pDiffuseMap 노말 스펙큘러 맵에 넣어주자.
다음 인접정보pAdjacency는 CloneMesh를 통해 복사받은 메시컨테이너의pMesh의GetNumFaces함수를 통해 폴리곤의 갯수를 구하고 *3할당해주고 memcpy로 pAdjacency를 pMeshContainer->pAdjacency에 복사해주자.
pMeshContainer->pSkinInfo = pSkinInfo로 값을 넣어주고
삭제되지않게 참조수를 1늘려준다.
뼈의갯수 iNumBones는 스킨인포의 GetNumBones()함수로 넣어준다.