assimp를 premake로 빌드하기

2023. 11. 5. 18:08뚝딱뚝딱 만들기 Devlog/게임엔진 (Ramensoup)

3d 렌더러를 만들기위해 obj 파일을 읽을 수 있는 라이브러리가 필요했습니다.

여러개가 있었는데, 여러 포맷을 지원해주는 assimp를 이용하기로 했습니다.

assimp: https://github.com/assimp/assimp

 

GitHub - assimp/assimp: The official Open-Asset-Importer-Library Repository. Loads 40+ 3D-file-formats into one unified and clea

The official Open-Asset-Importer-Library Repository. Loads 40+ 3D-file-formats into one unified and clean data structure. - GitHub - assimp/assimp: The official Open-Asset-Importer-Library Reposit...

github.com

 

그런데 cmake만 지원하고, 폴더 구조도 정말 복잡해서 힘들었습니다.

premake를 이용해 assimp를 이용하고 싶은 분들을 위해, 그리고 나중에 또 이 짓을 해야할 저를 위해 기록에 남기려합니다.

헤더파일 생성

assimp를 클론받고 가장 먼저 할 일은 cmake로 config.h와 revision.h를 만드는 것입니다.

각각 include/assimp/config.h.in, ./revision.h.in 에 저장돼있습니다.

참고로 assimp 레포는 include에 해더들이, code에 구현체가 들어있습니다.

 

이 in 파일들은 cmake를 이용해 .h 파일을 만드는데 활용됩니다.

cmake를 이용해 만들고나면 프로젝트의 복사본이 아웃풋 디렉토리에 생기는데,

위 두 파일을 같은 위치에서 찾을 수 있습니다.

이 두 파일을 복사해 클론받은 assimp 파일에 붙여넣어 줍니다. 이 뒤 복사본은 삭제해도 됩니다.

복사본을 만들지 않고 원본 프로젝트 디렉토리에 만들어주는 기능이 분명 있을 것 같은데,

그건 나중에 cmake를 배울 때 알아보는걸로 하겠습니다 (아마 아웃풋을 같은 디렉토리로 지정하면 될지도..)

premake 파일 작성

그 뒤 premake5.lua 파일을 만들어줍니다.

https://gist.github.com/Cannedfood/a71652022f066c8032f5a1c01919c55d 를 활용했습니다.

이게 옛날거라 그런지 복붙하면 바로 되진 않는데,

몇가지 수정사항이 있습니다.

  1. 위 예제는 premake 파일을 assimp 바깥에 만드는 방법으로 했는데, 저는 그냥 안에 만들었으므로 assimp/ 들을 다 떼줬습니다.
  2. 제 엔진에는 static linking을 활용할 것이므로, lib 파일을 만들기 위해 kind를 StaticLib로 바꿔줍니다.
  3. includedirs에 'include/' 를 추가해줍니다.
  4. files에 'code/**'를 추가해줍니다. 여기서 **은 하위 폴더까지 recursive하게 지정하는 방식이고, 위 작성자분의 예제에선 몇 개만 골라서 써주셨는데 importer들의 경로도 맞지 않고, 어차피 전처리기로 사용하지 않는 코드는 빠지는 듯 하니 다 추가해줬습니다.
  5. 마지막에 Debug, Release등 configuration을 추가해줍니다. 이걸 안해주니 관련한 충돌이 일어났습니다.

삽질결과 작동하는 premake 파일을 완성했습니다.

https://github.com/HappyFaceFriend/assimp/blob/master/premake5.lua

공식문서에 적힌 예제코드 DoTheImportThing 를 실행한 결과, 잘 실행됐네요.

 

예전같았으면 시도조차 안해봤을텐데, premake에 대해서도 좀 알게되고 링킹에러를 보는 요령도 생기다보니 원하는 바를 이뤄냈습니다.

여기에는 초안 코드를 공유해준 Cannedfood님과 적절한 주석과 문서화가 잘 된 assimp의 공이 컸던 것 같습니다.

.h 파일의 구현체가 동일한 이름의 .cpp에 있지 않고 다른 곳에 있으면 주석으로 남기는 습관을 들이는게 좋을 것 같습니다.

반응형