explicit Mailbox(size_t cap) : capacity_(cap) , slots_(new SLOT_T<T> [cap + 2 * kSlotPadding]) , stride_(computeStride(cap)) , pushTicket_(0) , popTicket_(0) {}
void GeometryBatch::setVertices(const std::shared_ptr<Buffer>& vbo, size_t count, const std::vector<VertexElement>& layout) { m_vbo = vbo; m_vertexCount = count; m_vao.bind(); size_t computedStride = computeStride(layout); size_t previousOffset = 0; vbo->bind(GL_ARRAY_BUFFER); for (size_t i = 0; i < layout.size(); ++i) { auto element = layout[i]; size_t offset = element.offset; // if offset is 0 then compute it if (i != 0 && offset == 0) offset = previousOffset + layout[i - 1].numComponents * elementTypeSize(layout[i - 1].type); previousOffset = offset; size_t stride = element.stride; if (stride == 0) stride = computedStride; glEnableVertexAttribArray(i); switch (element.type) { case VertexElementType::Float: glVertexAttribPointer(i, element.numComponents, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const void*>(offset)); break; case VertexElementType::Double: glVertexAttribLPointer(i, element.numComponents, GL_DOUBLE, stride, reinterpret_cast<const void*>(offset)); case VertexElementType::Byte: glVertexAttribIPointer(i, element.numComponents, GL_BYTE, stride, reinterpret_cast<const void*>(offset)); break; case VertexElementType::UnsignedByte: glVertexAttribIPointer(i, element.numComponents, GL_UNSIGNED_BYTE, stride, reinterpret_cast<const void*>(offset)); break; case VertexElementType::Short: glVertexAttribIPointer(i, element.numComponents, GL_SHORT, stride, reinterpret_cast<const void*>(offset)); break; case VertexElementType::UnsignedShort: glVertexAttribIPointer(i, element.numComponents, GL_UNSIGNED_SHORT, stride, reinterpret_cast<const void*>(offset)); break; case VertexElementType::Int: glVertexAttribIPointer(i, element.numComponents, GL_INT, stride, reinterpret_cast<const void*>(offset)); break; case VertexElementType::UsignedInt: glVertexAttribIPointer(i, element.numComponents, GL_UNSIGNED_INT, stride, reinterpret_cast<const void*>(offset)); break; } } }