Я хотел бы использовать некоторый существующий код C++, NvTriStrip, в инструменте Python.
ПОТЯНИТЕ легко обрабатывает функции с простыми параметрами, но основную функцию, GenerateStrips
, намного более сложно.
Что я должен вставить файл интерфейса SWIG для указания на это primGroups
действительно выходной параметр и что он должен быть очищен с delete[]
?
///////////////////////////////////////////////////////////////////////////
// GenerateStrips()
//
// in_indices: input index list, the indices you would use to render
// in_numIndices: number of entries in in_indices
// primGroups: array of optimized/stripified PrimitiveGroups
// numGroups: number of groups returned
//
// Be sure to call delete[] on the returned primGroups to avoid leaking mem
//
bool GenerateStrips( const unsigned short* in_indices,
const unsigned int in_numIndices,
PrimitiveGroup** primGroups,
unsigned short* numGroups,
bool validateEnabled = false );
К вашему сведению вот PrimitiveGroup
объявление:
enum PrimType
{
PT_LIST,
PT_STRIP,
PT_FAN
};
struct PrimitiveGroup
{
PrimType type;
unsigned int numIndices;
unsigned short* indices;
PrimitiveGroup() : type(PT_STRIP), numIndices(0), indices(NULL) {}
~PrimitiveGroup()
{
if(indices)
delete[] indices;
indices = NULL;
}
};
Я не знаю, как это сделать с помощью SWIG, но вы можете рассмотреть возможность перехода на более современную систему связывания, такую как Pyrex или Cython.
Например, Pyrex дает вам доступ к C++ delete для подобных случаев. Вот отрывок из документации:
Disposal
Оператор del может быть применен к указателю на C++ struct для его удаления. Это эквивалентно delete в C++.
cdef Кустарник *big_sh big_sh = new Shrubbery(42.0) display_in_garden_show(big_sh) del big_sh
http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/Manual/using_with_c++.html
Вы смотрели документацию SWIG относительно их библиотек "cpointer.i" и "carray.i"? Их можно найти здесь .Вот как вам нужно манипулировать вещами, если вы не хотите создавать свои собственные служебные библиотеки для сопровождения обернутого кода. Вот ссылка на обработку указателей Python с помощью SWIG .
К вопросу о том, как заставить его распознавать ввод по сравнению с выводом. У них есть еще один раздел в документации здесь , который описывает именно это. Вы помечаете вещи ВЫХОД
в файле * .i. Итак, в вашем случае вы должны написать:
%inline{
extern bool GenerateStrips( const unsigned short* in_dices,
const unsigned short* in_numIndices,
PrimitiveGroup** OUTPUT,
unsigned short* numGroups,
bool validated );
%}
, что дает вам функцию, которая возвращает массивы bool и PrimitiveGroup *
в виде кортежа.
Это поможет?
На самом деле так просто сделать привязки Python для вещей напрямую, что я не знаю, почему люди беспокоятся о запутанных обертках вроде SWIG.
Просто используйте Py_BuildValue один раз для каждого элемента внешнего массива, создавая один кортеж на строку. Сохраните эти кортежи в массиве C. Затем вызовите PyList_New и PyList_SetSlice , чтобы сгенерировать список кортежей и вернуть указатель на список из вашей функции C.