void OpenGLRenderManager::doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count) { OpenGLVertexBuffer* buffer = static_cast<OpenGLVertexBuffer*>(_buffer); unsigned int buffer_id = buffer->getBufferID(); MYGUI_PLATFORM_ASSERT(buffer_id, "Vertex buffer is not created"); unsigned int texture_id = 0; if (_texture) { OpenGLTexture* texture = static_cast<OpenGLTexture*>(_texture); texture_id = texture->getTextureID(); //MYGUI_PLATFORM_ASSERT(texture_id, "Texture is not created"); } glBindTexture(GL_TEXTURE_2D, texture_id); glBindBuffer(GL_ARRAY_BUFFER, buffer_id); // enable vertex arrays glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); // before draw, specify vertex and index arrays with their offsets size_t offset = 0; glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (void*)offset); offset += (sizeof(float) * 3); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)offset); offset += (4); glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), (void*)offset); glDrawArrays(GL_TRIANGLES, 0, _count); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); }
void OpenGLRenderer::drawVertexBuffer(VertexBuffer *buffer, bool enableColorBuffer) { OpenGLVertexBuffer *glVertexBuffer = (OpenGLVertexBuffer*)buffer; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); if(enableColorBuffer) { glEnableClientState(GL_COLOR_ARRAY); glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getColorBufferID()); glColorPointer( 4, GL_FLOAT, 0, (char *) NULL ); } glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getVertexBufferID()); glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL ); glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getNormalBufferID()); glNormalPointer(GL_FLOAT, 0, (char *) NULL ); glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getTextCoordBufferID()); glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL ); glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getTangentBufferID()); glEnableVertexAttribArrayARB(6); glVertexAttribPointer(6, 3, GL_FLOAT, 0, 0, (char *)NULL); GLenum mode = GL_TRIANGLES; switch(buffer->meshType) { case Mesh::TRI_MESH: mode = GL_TRIANGLES; break; case Mesh::TRIFAN_MESH: mode = GL_TRIANGLE_FAN; break; case Mesh::QUAD_MESH: mode = GL_QUADS; break; case Mesh::LINE_STRIP_MESH: mode = GL_LINE_STRIP; break; case Mesh::LINE_LOOP_MESH: mode = GL_LINE_LOOP; break; case Mesh::LINE_MESH: mode = GL_LINES; break; case Mesh::POINT_MESH: mode = GL_POINTS; break; } glDrawArrays( mode, 0, buffer->getVertexCount() ); glDisableClientState( GL_VERTEX_ARRAY); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); glDisableClientState( GL_NORMAL_ARRAY ); if(enableColorBuffer) { glDisableClientState( GL_COLOR_ARRAY ); } }
void OpenGLRenderer::drawVertexBuffer(VertexBuffer *buffer) { OpenGLVertexBuffer *glVertexBuffer = (OpenGLVertexBuffer*)buffer; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); // glEnableClientState(GL_COLOR_ARRAY); // glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getColorBufferID()); // glTexCoordPointer( 4, GL_FLOAT, 0, (char *) NULL ); glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getVertexBufferID()); glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL ); glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getNormalBufferID()); glNormalPointer(GL_FLOAT, 0, (char *) NULL ); glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getTextCoordBufferID()); glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL ); GLenum mode = GL_TRIANGLES; switch(buffer->meshType) { case Mesh::TRI_MESH: switch(renderMode) { case RENDER_MODE_NORMAL: mode = GL_TRIANGLES; break; case RENDER_MODE_WIREFRAME: mode = GL_LINE_LOOP; break; } break; case Mesh::TRIFAN_MESH: switch(renderMode) { case RENDER_MODE_NORMAL: mode = GL_TRIANGLE_FAN; break; case RENDER_MODE_WIREFRAME: mode = GL_LINE_LOOP; break; } break; case Mesh::QUAD_MESH: switch(renderMode) { case RENDER_MODE_NORMAL: mode = GL_QUADS; break; case RENDER_MODE_WIREFRAME: mode = GL_LINE_LOOP; break; } break; case Mesh::LINE_MESH: mode = GL_LINES; break; case Mesh::POINT_MESH: mode = GL_POINTS; break; } glDrawArrays( mode, 0, buffer->getVertexCount() ); glDisableClientState( GL_VERTEX_ARRAY); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); glDisableClientState( GL_NORMAL_ARRAY ); // glDisableClientState( GL_COLOR_ARRAY ); }