У меня есть класс, который должен хранить данные пикселей (плавающие для позиции, плавающие для цвета). Я пытаюсь использовать стиль C ++ в элементах данных (данные хранятся в std::array<float, N>
вместо простых массивов C). В классе есть другие методы получения, установки и функции, предназначенные для того, чтобы быть «помощниками» для заполнения этих полей.
Теперь мне нужно создать буфер данных вершины OpenGL, куда я должен записать
4 floats for xyzw
4 floats for rgba
2 floats for UV coords
в этом порядке. Мне интересно, как я должен это сделать .. Я пытался сделать
class MyVertexData {
std::array<float, 4> pos;
std::array<float, 4> rgba;
std::array<float, 2> uv;
public:
void writeData(float *ptrToMemory) {
if(ptrToMemory == nullptr)
throw std::runtime_exception("Null pointer");
std::array<float, 10> output;
output= {
pos[0], pos[1], pos[2], pos[3],
rgba[0], rgba[1], rgba[2], rgba[3],
uv[0], uv[1]
};
memcpy(memory, out.data(), 10 * sizeof(float));
}
};// Caller code
std::vector<float[10]> buffer(4);
vertex0.writeElements(buffer[0]);
vertex1.writeElements(buffer[1]);
vertex2.writeElements(buffer[2]);
vertex3.writeElements(buffer[3]);
но у этого подхода есть две проблемы:
Я не могу просто вернуть std::unique_ptr
так как мне нужна непрерывная область памяти (buffer
) где элементы должны храниться, но мне также необходимо различать различные элементы (что также сделает код более читабельным).
Было бы неплохо вернуть умный указатель или что-то подобное, чью память я могу легко «объединить» с другими элементами, чтобы я мог безопасно передать этот материал в OpenGL.
CppCoreGuidelines вводит span
который является Посмотреть смежного элемента, так что вы можете использовать что-то вроде:
void writeData(gsl::span<float, 10> ptrToMemory)
выразить намерение.
Других решений пока нет …