У меня есть класс, который должен хранить данные пикселя (плавает для позиции, плавает для цвета). Я пытаюсь использовать стиль 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]);
, но этот подход имеет две проблемы:
- мне нужно доверять абоненту иметь выделенную память для хранения 10 поплавки
- нет C++ 11 + подпись, я просто получить указатель поплавка
Я не могу просто возвращать std::unique_ptr
так как мне нужно область смежной памяти (buffer
), где элементы для сохранения, но мне также необходимо различать различные элементы (что также сделает код более читаемым).
Было бы неплохо вернуть умный указатель или что-то подобное, память которого я могу легко «конкатенировать» с другими элементами, чтобы я мог безопасно передать этот материал OpenGL.
Считаете ли вы использование 'std :: vector'? Кроме того, я знаю, что необработанные массивы не могут быть скопированы (и поэтому не могут быть возвращены из функции), но я не уверен в 'std :: array'. –
@UlrichEckhardt Я думал о возврате 'std :: array', но они являются объектами контейнера, такими как 'vector', и я должен, вероятно, скопировать из их памяти впоследствии в 'buffer' – Dean
Вы хотите получить некоторый' массив_view'. – Jarod42