📃 Load Mesh
이전에 추가해두었던 툴바 버튼인 LoadMesh를 누르면, 파일로 저장되어있는 Mesh 정보를 읽어서 불러올 수 있는 기능을 구현해보았다.
🚩 IDesktopPlatform::OpenFileDialog
툴바 버튼을 누르면 실행되도록 델리게이트에 등록시켜놓은 OnClicked_LoadMesh 함수에 기능을 구현하였다.
우선, 게임이 실행중이라면 Load Mesh 기능이 작동하지않도록 FApp::IsGame 함수로 조건문을 걸어주었다.
이후부터는 사실 Save Mesh의 기능을 구현했을때와 거의 동일한 코드이다.
IMainFrameModule 객체로 MainFrame을 받아오고, 윈도우 Handle을 가져와서 Load할 파일을 찾을 수 있는 창을 띄우는 것이다.
이때 Save Mesh와 다른점은 IDesktopPlatform 객체의 OpenFileDialog 함수를 사용한다는 점이다. (Save Mesh에서는 SaveFileDialog 함수를 사용했었다)
🚩 LoadFileToArray
다음으로 BufferArchive 객체를 이용한 LoadFileToArray 함수를 실행시켜 파일을 배열로 읽어오도록 변환하였다. (Save Mesh에서는 SaveArrayToFile 함수를 사용했었다. Load는 Save의 반대!)
💡 FMemoryReader, Seek
SSD에 저장되어있는 Mesh 파일을 I/O 를 거쳐 RAM으로 전송하기 위해선 FMemoryReader라는 객체가 꼭 필요하다.
Mesh 파일을 Save할땐 BufferArchive가 I/O에서 SSD로 넘기는 스트림 전송 역할을 모두 수행할 수 있지만, SSD에서 I/O로 스트림 전송하는 역할은 수행하지 않는다.
따라서 FMemoryReader를 직접 지정하여 SSD에서 I/O로 데이터를 전송할 수 있도록 만들어주었다.
archive의 Seek 함수는 데이터를 읽을 위치를 가리키는 포인터라고 보면 된다.
이렇게 MemoryReader를 생성하여 Seek 까지 지정하면 메모리를 전송할 통로를 다 만들고, 메모리를 올릴 준비를 끝낸것이다.
MemoryReader 객체인 reader를 사용하여 읽어들이는 데이터를 FStaticMesh_DetailData 구조체인 data 변수에 저장한 뒤, 남은 데이터까지 전송받기 위해 FlushCache 함수를 실행시켰다.
이후 Reader는 Empty로 비우지 않고 Close로 닫아준다.
읽어들인 데이터가 정상적으로 불러진 Mesh 데이터가 맞는지 Log를 찍어 확인해보았다.
이후 코드는 Load한 Mesh 데이터를 파일명_Copied라는 이름으로 다시 csv를 출력해본 코드이다.
컴파일 후 프로젝트의 실행 결과를 보면 아래와 같다.
툴바의 Load Mesh 버튼을 클릭하면 읽어드릴 파일을 선택할 window 창이 뜬다.
이후 읽어들이려는 파일을 선택한 뒤, 열기를 선택하면 Log로 Mesh의 정점 데이터가 출력된다.
Log에 출력된 데이터와 Static Mesh의 정보를 비교하면 올바른 데이터가 읽어졌다는것을 알 수 있다.