예제 #1
0
 explicit Mailbox(size_t cap)
     : capacity_(cap)
     , slots_(new SLOT_T<T> [cap + 2 * kSlotPadding])
     , stride_(computeStride(cap))
     , pushTicket_(0)
     , popTicket_(0)
 {}
예제 #2
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;
		}
	}
}