Продолжение предыдущего поста с генерацией модулей daScript к С++-библиотекам с помощью автоматического генератора dasBind
.
daScript: C++ auto-bindings, msgpack
На этот раз чуть более сложный случай с библиотекой assimp, которая позволяет загружать 3d-модели в различных форматах. Для начала — собираем библиотеку из исходников. Я бы рекомендовал версию 4.1.0, как стабильную, в более новых сломаны некоторые настройки постпроцессинга загруженных мешей.
Привязки assimp к другим языкам в основном репозитории малость заброшены, так что попутно починим и их.
Python#
Самый простой случай — достаточно поправить синтаксические отличия между Python 2 и 3.
DotNet, open3mod#
Живёт тут, необходимо:
- Собрать библиотеку assimp в DLL, переименовать в Assimp32.dll или Assimp64.dll.
- Собрать библиотеку AssimNet.dll с классами обёртками.
- Собрать проект
AssimpNet.Interop.Generator
, который нужен, чтобы пропатчить IL-код из AssimpNet размерами типов, полученных из PDB файла. Для этой техники используется библиотека Mono.Cecil. - Пропатчить библиотеку (данный шаг прописан в PostBuild-степ в решении, но лучше убедиться, что он корректно отработал)
- Собрать и запустить open3Mod - просмотрщик, в котором можно проверить работоспособность библиотеки.
daScript#
Автоматический генератор привязок dasBind
не работает с C++ template-кодом, но все заголовочные файлы assimp
поддерживают также c-интерфейс. Однако без некоторой “доработки напильником” воспользоваться этим интерфейсом не удастся, так как, несмотря на то, что генератору привязок можно указать, чтобы он парсил заголовочные файлы как c-код, возникают ошибки двойного определения типов при использования этих же хидеров в C++ коде самого проекта, который будет использовать эти привязки. Причины такого поведения — попытка различать, какой из интерфейсов использовать с помощью макроса __cplusplus
, который всегда определён в C++ коде (exrern "C"
его не отключает).
Однако можно пойти на хитрость, и просто заменить во всех исходниках макрос __cplusplus
на какой-нибудь кастомный, который не будет определен в коде, чтобы как dasBind
, так и использующий сгенерированный C++-модуль dasAssimp
, “увидели” именно сишный интерфейс к библиотеке.
Ну и дальше, аналогично инструкции в предыдущем посте:
и дописываем функцию преобразования dasString
в std::string
, чтобы генератор привязок мог понять, как с ней работать
После генерации модуля можно попробовать им воспользоваться (предварительно не забыть прилинковать к проекту lib файлы от библиотеки assimp
и сделать доступным путь к собранный dll, если ассимп был собран как динамическая библиотека):
Данный код загружает модель из файла character.dae
, и печатает иерархию костей скелета в этой модели:
Сырой код модуля, когда-нибудь надо будет причесать