Я пытаюсь создать структуры вершин в 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, поскольку у меня никогда не было причин использовать их или узнавать, что заставляет их работать до сих пор.
Любая помощь приветствуется!
Предупреждение: это может не отвечать на ваш первоначальный вопрос. Это даже не ответ, а скорее вопрос:
Рассматривали ли вы создание этих struct
— используете ли язык высокого уровня вместо макросов C?
Как вы уже узнали, макросы C неуклюжи и их трудно отлаживать. Я бы предпочел написать скрипт (скажем, на Python, но любой язык сценариев с хорошо развитыми возможностями обработки строк), который бы вывел opengl_boilerplate.h
файл, содержащий ваши struct
деклараций. Затем вы вызываете этот скрипт при сборке вашего программного обеспечения. Я не знаю, как это сделать с VS2013, но, возможно, достаточно запустить его один раз (зависит от вашего проекта).