Я пытаюсь создать структуры вершин в OpenGL, используя макросы для определения основ вершин, и макрос в конечном итоге генерирует шаблонный код, необходимый для использования с OpenGL (glGetAttribLocation
, glEnableVertexAttribArray
, glVertexAttribPointer
и т. д.).
Мои макросы определены как таковые:
#define DEFINE_GPU_VERTEX_ATTRIBUTE(R, DATA, ELEM) BOOST_PP_CAT(ELEM, DATA);
#define DEFINE_GPU_VERTEX(NAME, ...) struct NAME##_gpu_vertex_t \
{ \
BOOST_PP_SEQ_FOR_EACH(DEFINE_GPU_VERTEX_ATTRIBUTE, _, __VA_ARGS__) \
}
Это пример того, как я собираюсь использовать макрос:
DEFINE_GPU_VERTEX(bsp,
((vec3_t), position),
((vec3_t), normal),
((vec2_t), texcoord));
Где первый аргумент (bsp
) — это префикс имени, а все переменные аргументы — это пары типов и имен атрибутов.
Я ожидаю, что он сгенерирует определение структуры следующим образом:
struct bsp_gpu_vertex_t
{
vec3_t position;
vec3_t normal;
vec2_t texcoord;
}
Однако, похоже, он генерирует пустую структуру. Что я здесь делаю неправильно?
Я не знаком с макросами C, не говоря уже о макросах Boost, поскольку у меня никогда не было причин использовать их или узнавать, что заставляет их работать до сих пор.
Любая помощь приветствуется!
g++ -C -E
или с помощью соответствующего компилятора и IDE) и загляните внутрь с помощью редактора или пейджера (например,less
). Также сообщите, какой компилятор и операционную систему вы используете, и какова ваша команда компиляции. - person Basile Starynkevitch   schedule 26.07.2014BOOST_PP_**SEQ**_FOR_EACH
требуется последовательность, а вы ее не предоставляете. Существует макрос, который преобразует вариативные данные в последовательность, может помочь. Я считаю, что обычный способ сделать это (по крайней мере, тот, который используется в адаптациях/определениях структур слияния) состоит в том, чтобы использовать непосредственно последовательность. Второй и третий подходы в этом ответе может помочь. - person llonesmiz   schedule 28.07.2014