Я передаю структуры, содержащие буферы вершин openGL и данные, для удобства функций, которые связывают и обновляют дату на GPU.Прямо сейчас у меня есть следующее:
struct VertexBufferData {
VertexBuffer vbo;
ElementBuffer ebo;
size_t v_cap;
size_t v_count;
size_t i_cap;
size_t i_count;
GLfloat* vertices; // dynamically allocated
GLuint* indices; // dynamically allocated
};
И все же иногда я знаю размеры некоторых вершин и буферов индексов во время компиляции, и в этом случае я хотел бы сделать это:
struct VertexBufferData {
VertexBuffer vbo;
ElementBuffer ebo;
size_t v_cap;
size_t v_count;
size_t i_cap;
size_t i_count;
GLfloat vertices[SOME_CONST_SIZE_1];
GLuint indices[SOME_CONST_SIZE_2];
};
Структуры практически идентичны, но статические массивы и указатель / динамически распределенная память различны и требуют разных типов, что означает, что мне нужно будет дублировать много кода (функций и других структур, например, void gl_bind_buffers_and_upload_data(VertexBufferData* vbd, GLenum usage)
) только для поддержкиобе версии структуры.
Есть ли способ рассмотреть обе структуры как один и тот же тип или элегантный обходной путь без переключения на наследование C ++ (которого я пытаюсь избежать) .Я хотел бы сохранить данные как POD.Параметризация шаблона не решает проблему, но может ли быть другой легкий способ решения проблемы в C ++?(Я бы хотел использовать функции, которые не используют виртуальные функции).
Моей первой мыслью было бы создать какую-то сущность-обертку, но это звучит слишком сложно.Должен ли я просто согласиться с дублированием кода?