示例#1
0
	void OGL4GeometryData::AttachIndexBuffer(GPUBufferPtr pBuffer, G_FORMAT format)
	{
		if(m_pIndexBuffer)
		{
			m_pIndexBuffer->Release();
		}
		m_pIndexBuffer = pBuffer;

		switch(format)
		{
		case G_FORMAT_R32_UINT:
			m_indexType = GL_UNSIGNED_INT;
				m_indexElementBytes	= 4;
			break;
		case G_FORMAT_R16_UINT:
			m_indexType = GL_UNSIGNED_SHORT;
				m_indexElementBytes = 2;
			break;
		default:
			assert(0);
			m_indexType = GL_UNSIGNED_SHORT;
			m_indexElementBytes = 2;
			break;
		}

		OGL4BufferPtr pOGLBuffer = std::dynamic_pointer_cast<OGL4Buffer>(m_pIndexBuffer);

		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pOGLBuffer->GetBufferObject());
	}
示例#2
0
	void OGL4GeometryData::CommitModify()
	{
		glBindVertexArray(m_vao);

		OGL4BufferPtr pOGLBuffer = std::dynamic_pointer_cast<OGL4Buffer>(m_pVertexBuffer);

		glBindBuffer(GL_ARRAY_BUFFER, pOGLBuffer->GetBufferObject());


		pOGLBuffer = std::dynamic_pointer_cast<OGL4Buffer>(m_pIndexBuffer);
		if(pOGLBuffer)
		{
			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pOGLBuffer->GetBufferObject());
		}

		glBindVertexArray(0);
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
	}
示例#3
0
	void OGL4GeometryData::SetVertexLayout(const VertexLayout& layout)
	{
		m_layout = layout;

		unsigned int stride = m_layout.VertexStride();

		OGL4BufferPtr pOGLBuffer = std::dynamic_pointer_cast<OGL4Buffer>(m_pVertexBuffer);

		glBindBuffer(GL_ARRAY_BUFFER, pOGLBuffer->GetBufferObject());

		unsigned int offset = 0;
		for(unsigned int i = 0; i < m_layout.AttrCount(); ++i)
		{
			glEnableVertexAttribArray(i);

			G_FORMAT type = m_layout.AttrType(i);

			unsigned int value_count = 0;
			GLenum gltype = GL_INVALID_ENUM;

			if(OGL4Convert::FormatToGLVertexAttr(type, value_count, gltype) == false)
			{
				assert(0);
			}

			switch(gltype)
			{
			case GL_INT:
			case GL_UNSIGNED_INT:
				glVertexAttribIPointer(i, value_count, gltype, stride, (GLvoid*)(m_vbOffset + offset));
				break;
			default:
				glVertexAttribPointer(i, value_count, gltype, GL_FALSE, stride, (GLvoid*)(m_vbOffset + offset));
				break;
			}

			offset += m_layout.TypeBytes(type);
		}
	}