diff --git a/Userland/Libraries/LibGL/Vertex.cpp b/Userland/Libraries/LibGL/Vertex.cpp index f7e5a91c3de..ef15565b934 100644 --- a/Userland/Libraries/LibGL/Vertex.cpp +++ b/Userland/Libraries/LibGL/Vertex.cpp @@ -117,7 +117,12 @@ void GLContext::gl_color_pointer(GLint size, GLenum type, GLsizei stride, void c GL_INVALID_ENUM); RETURN_WITH_ERROR_IF(stride < 0, GL_INVALID_VALUE); - m_client_color_pointer = { .size = size, .type = type, .normalize = true, .stride = stride, .pointer = pointer }; + void const* data_pointer = pointer; + if (m_array_buffer) { + size_t data_offset = reinterpret_cast(pointer); + data_pointer = m_array_buffer->offset_data(data_offset); + } + m_client_color_pointer = { .size = size, .type = type, .normalize = true, .stride = stride, .pointer = data_pointer }; } void GLContext::gl_draw_arrays(GLenum mode, GLint first, GLsizei count) @@ -191,18 +196,24 @@ void GLContext::gl_draw_elements(GLenum mode, GLsizei count, GLenum type, void c RETURN_WITH_ERROR_IF(count < 0, GL_INVALID_VALUE); + void const* index_data = indices; + if (m_element_array_buffer) { + size_t data_offset = reinterpret_cast(indices); + index_data = m_element_array_buffer->offset_data(data_offset); + } + gl_begin(mode); for (int index = 0; index < count; index++) { int i = 0; switch (type) { case GL_UNSIGNED_BYTE: - i = reinterpret_cast(indices)[index]; + i = reinterpret_cast(index_data)[index]; break; case GL_UNSIGNED_SHORT: - i = reinterpret_cast(indices)[index]; + i = reinterpret_cast(index_data)[index]; break; case GL_UNSIGNED_INT: - i = reinterpret_cast(indices)[index]; + i = reinterpret_cast(index_data)[index]; break; } @@ -253,7 +264,12 @@ void GLContext::gl_normal_pointer(GLenum type, GLsizei stride, void const* point GL_INVALID_ENUM); RETURN_WITH_ERROR_IF(stride < 0, GL_INVALID_VALUE); - m_client_normal_pointer = { .size = 3, .type = type, .normalize = true, .stride = stride, .pointer = pointer }; + void const* data_pointer = pointer; + if (m_array_buffer) { + size_t data_offset = reinterpret_cast(pointer); + data_pointer = m_array_buffer->offset_data(data_offset); + } + m_client_normal_pointer = { .size = 3, .type = type, .normalize = true, .stride = stride, .pointer = data_pointer }; } void GLContext::gl_tex_coord_pointer(GLint size, GLenum type, GLsizei stride, void const* pointer) @@ -264,7 +280,13 @@ void GLContext::gl_tex_coord_pointer(GLint size, GLenum type, GLsizei stride, vo RETURN_WITH_ERROR_IF(stride < 0, GL_INVALID_VALUE); auto& tex_coord_pointer = m_client_tex_coord_pointer[m_client_active_texture]; - tex_coord_pointer = { .size = size, .type = type, .normalize = false, .stride = stride, .pointer = pointer }; + + void const* data_pointer = pointer; + if (m_array_buffer) { + size_t data_offset = reinterpret_cast(pointer); + data_pointer = m_array_buffer->offset_data(data_offset); + } + tex_coord_pointer = { .size = size, .type = type, .normalize = false, .stride = stride, .pointer = data_pointer }; } void GLContext::gl_vertex(GLdouble x, GLdouble y, GLdouble z, GLdouble w) @@ -289,7 +311,12 @@ void GLContext::gl_vertex_pointer(GLint size, GLenum type, GLsizei stride, void RETURN_WITH_ERROR_IF(!(type == GL_SHORT || type == GL_INT || type == GL_FLOAT || type == GL_DOUBLE), GL_INVALID_ENUM); RETURN_WITH_ERROR_IF(stride < 0, GL_INVALID_VALUE); - m_client_vertex_pointer = { .size = size, .type = type, .normalize = false, .stride = stride, .pointer = pointer }; + void const* data_pointer = pointer; + if (m_array_buffer) { + size_t data_offset = reinterpret_cast(pointer); + data_pointer = m_array_buffer->offset_data(data_offset); + } + m_client_vertex_pointer = { .size = size, .type = type, .normalize = false, .stride = stride, .pointer = data_pointer }; } }