본문 바로가기
게임 개발/[D3D_Portfolio] DirectX3D 팀 포트폴리오 작업일지

16. 불러온 FBX 파일 데이터를 파일입출력을 통해 저장

by 헛둘이 2023. 8. 25.

불러온 FBX 파일 데이터를 파일입출력을 통해 저장

- FBX는 씬, 카메라, 조명과 같은 다양한 정보들을 포함하고 있다.

- FBXLoader 클래스는 여기서 메쉬에 해당하는 것들만 추출해서 저장하는 역할을 하는데, 트리를 재귀적으로 탐색하는 구조다보니, 시간이 오래 걸린다는 단점이 있다.

- 애니메이션 클립의 경우 최종 행렬을 구하는 로직이 모든 부모 좌표계로 향하는 행렬을 곱해줘서 구하는 구조이기 때문에 이 부분이 특히 시간이 오래 걸린다.

- 한 번 불러오고 난 후에는 그냥 불러온 데이터를 파일입출력을 통해 바이너리로 저장하고 다음부턴 그 파일을 다시 불러오는 식으로 구현하면 빠르지 않을까?

 

- 오랜만에 파일 입출력을 사용해서 꽤나 애먹긴 했지만, 그래도 나름 성공적으로 구현했다. 

    void MeshData::Save(const wstring& _path)
    {
        if (true == fs::exists(_path))
            return;

        FILE* pFile = nullptr;
        _wfopen_s(&pFile, _path.c_str(), L"wb");

        AssertEx(nullptr != pFile, L"MeshData::Save() - 파일 생성 실패!, 이미 존재하는 파일명일 수 있음");
        AssertEx(nullptr != mpMesh, L"MeshData::Save() - 메쉬가 존재하지 않는 MeshData를 저장하려는 시도");

        UINT32 containerSize = mpMesh->GetMeshContainerCount();
        fwrite(&containerSize, sizeof(UINT32), 1, pFile);
        for (UINT i = 0; i < containerSize; ++i)
        {
            MeshContainer* pMeshContainer = mpMesh->GetMeshContainer(i);

            VertexBufferInfo& vtxInfo = pMeshContainer->vertexBufferInfo;
            fwrite(&vtxInfo.count, sizeof(UINT32), 1, pFile);
            fwrite(vtxInfo.pData, sizeof(Vertex), vtxInfo.count, pFile);

            UINT32 indexBufferCount = static_cast<UINT32>(pMeshContainer->indexBufferGroup.size());
            fwrite(&indexBufferCount, sizeof(UINT32), 1, pFile);
            for (UINT32 j = 0; j < indexBufferCount; ++j)
            {
                IndexBufferInfo& idxInfo = pMeshContainer->indexBufferGroup[j];
                fwrite(&idxInfo.count, sizeof(UINT32), 1, pFile);
                fwrite(idxInfo.pData, sizeof(int), idxInfo.count, pFile);
            }
        }

        bool bIsMaterial = nullptr != mpMaterial;
        fwrite(&bIsMaterial, sizeof(bool), 1, pFile);

        if (true == bIsMaterial)
            mpMaterial->Save(pFile);
        

        fclose(pFile);
    }

- 아무 생각없이 &vtxInfo.pData라고 적었다가 한참 헤맸다... pData는 void형 포인터라서 주소로 넘기면 안되기 때문

- 요약하면 정점 정보와 인덱스 정보를 파일에 저장해놨다가 불러오는 것이다.

- 이전 포트폴리오 작업할 때 맵 구성요소를 파일로 다루기 위해 파일 입출력을 사용했던게 나름 도움이 되었다.

 

내일 할 일

- 애니메이션/본 구조도 파일에 병합

- ImGui 합치기

댓글