Никто не мешает нам придумать собственный формат хранения данных о трехмерной геометрии, и мы его придумаем

piramide.pmd

vertex:  1.0  1.0 0.0
vertex:  1.0 -1.0 0.0
vertex: -1.0 -1.0 0.0
vertex: -1.0  1.0 0.0
vertex:  0.0  0.0 2.0
face: 0 1 2 3
face: 0 3 4
face: 1 0 4
face: 2 1 4
face: 3 2 4

Здесь в начале файла идет список вершин с их координатами. Индексы вершин идут по порядку, начиная от нуля. После списка вершин идет список граней. Каждая грань задается перечнем индексов вершин, из которых она образована. Как видно ничего сложного. Задача - считать этот файл с диска и сформировать на его основе трехмерную геометрию.

Настройка проекта плагина: особенности сценария сборки

Если раньше мы собирали приложения, то теперь нам предстоит написать динамическую библиотеку, да не просто библиотеку а плагин к OSG, удовлетворяющий определенным требованиям. Выполнять эти требования начнем со сценария сборки проекта, который будет выглядеть так

plugin.pro

TEMPLATE = lib

CONFIG += plugin
CONFIG += no_plugin_name_prefix

TARGET = osgdb_pmd

win32-g++: TARGET = $$join(TARGET,,mingw_,)

win32 {

    OSG_LIB_DIRECTORY = $$(OSG_BIN_PATH)
    OSG_INCLUDE_DIRECTORY = $$(OSG_INCLUDE_PATH)
    DESTDIR = $$(OSG_PLUGINS_PATH)

    CONFIG(debug, debug|release) {

        TARGET = $$join(TARGET,,,d)

        LIBS += -L$$OSG_LIB_DIRECTORY -losgd
        LIBS += -L$$OSG_LIB_DIRECTORY -losgViewerd
        LIBS += -L$$OSG_LIB_DIRECTORY -losgDBd
        LIBS += -L$$OSG_LIB_DIRECTORY -lOpenThreadsd
        LIBS += -L$$OSG_LIB_DIRECTORY -losgUtild

    } else {

        LIBS += -L$$OSG_LIB_DIRECTORY -losg
        LIBS += -L$$OSG_LIB_DIRECTORY -losgViewer
        LIBS += -L$$OSG_LIB_DIRECTORY -losgDB
        LIBS += -L$$OSG_LIB_DIRECTORY -lOpenThreads
        LIBS += -L$$OSG_LIB_DIRECTORY -losgUtil

    }

    INCLUDEPATH += $$OSG_INCLUDE_DIRECTORY
}

unix {

    DESTDIR = /usr/lib/osgPlugins-3.7.0

    CONFIG(debug, debug|release) {

        TARGET = $$join(TARGET,,,d)

        LIBS += -losgd
        LIBS += -losgViewerd
        LIBS += -losgDBd
        LIBS += -lOpenThreadsd
        LIBS += -losgUtild

    } else {

        LIBS +=  -losg
        LIBS +=  -losgViewer
        LIBS +=  -losgDB
        LIBS +=  -lOpenThreads
        LIBS += -losgUtil
    }
}

INCLUDEPATH += ./include

HEADERS += $$files(./include/*.h)
SOURCES += $$files(./src/*.cpp)

Отдельные нюансы разберем подробнее

TEMPLATE = lib

означает что мы будем собирать библиотеку. Чтобы не происходила генерация символических ссылок, с помощью которых в *nix системах разруливаются вопросы конфликта версий библиотек, указываем системе сборки, что данная библиотека будет плагином, то есть будет загружаться в память “на лету”

CONFIG += plugin

Далее исключаем генерацию перфикса lib, который добалвяется при использовании компиляторов семейства gcc и учитывается рантаймовым окруженим при загрузке библиотеки

CONFIG += no_plugin_name_prefix

Задаем имя файлу библиотеки

TARGET = osgdb_pmd

где pmd - расширение файла изобретенного нами формата 3D-моделей. Далее обязательно указываем, что в случае сборки MinGW к именя обязательно добавляется префикс mingw_

win32-g++: TARGET = $$join(TARGET,,mingw_,)

Указываем путь сборки библиотеки: для Windows

DESTDIR = $$(OSG_PLUGINS_PATH)

для Linux

DESTDIR = /usr/lib/osgPlugins-3.7.0

Для линукс, при таком указании пути (что несоммненно является костылем, но я пока не нашел другого решения) даем на указанную папку с плагинами OSG права на запись от обычного пользователя

# chmod 666 /usr/lib/osgPlugins-3.7.0

Все остальные настройки сборки аналогичны применявшимся при сборке примеров-приложений ранее.

Настройка проекта плагина: особенности режима отладки

Так данный проект является динамической бибилотекой, то должна существовать программа, которая загружает эту бибилотеку в процессе своего исполнения. В качестве нее может выступать любое приложение, использующее OSG и в котором будет происходить вызов функции

node = osdDB::readNodeFile("piramide.pmd");

В этом случае произойдет загрузка нашего плагина. Чтобы не писать такую программу самостоятельно, воспользуемся готовым решением - стандартным просмотрщиком osgviewer, входящим в комплект поставки движка. Если в консоли выполнить

$ osgviewer piramide.pmd

то это так же вызовет срабатывание плагина. В настройках запуска проекта укажем путь к osgviewerd, в качестве рабочего каталога укажем тот католог, где лежит файл piramide.pmd, и этот же файл укажем в опциях командной строки osgviewer

Теперь мы сможем запускать плагин и отлаживать его прямо из IDE QtCreator.