X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Fvertexsetup_backend.cpp;h=f3243107b9591186b649a298fe9f7234c7b46355;hb=e530cd8edb12a8be87c59dbfa1e7e15c8198f3a3;hp=acd14f48b70c42fd539f85c277c09e06ac3a94e7;hpb=e70662d7812464159f2e47f4bebb69d88f89ae93;p=libs%2Fgl.git diff --git a/source/backends/opengl/vertexsetup_backend.cpp b/source/backends/opengl/vertexsetup_backend.cpp index acd14f48..f3243107 100644 --- a/source/backends/opengl/vertexsetup_backend.cpp +++ b/source/backends/opengl/vertexsetup_backend.cpp @@ -83,31 +83,34 @@ void OpenGLVertexSetup::update_vertex_array(const VertexArray &array, unsigned b glVertexArrayBindingDivisor(id, binding, divisor); } - unsigned offset = 0; + unsigned offset = array.get_offset(); for(VertexAttribute a: fmt) { unsigned sem = get_attribute_semantic(a); - bool integer = is_integer_attribute(a); - GLenum type = get_gl_type(get_attribute_source_type(a)); - unsigned cc = get_attribute_component_count(a); - if(direct) - { - if(integer) - glVertexArrayAttribIFormat(id, sem, cc, type, offset); - else - glVertexArrayAttribFormat(id, sem, cc, type, true, offset); - glVertexArrayAttribBinding(id, sem, binding); - glEnableVertexArrayAttrib(id, sem); - } - else + if(!is_padding(a)) { - if(integer) - glVertexAttribIPointer(sem, cc, type, stride, reinterpret_cast(offset)); + bool integer = is_integer_attribute(a); + GLenum type = get_gl_type(get_attribute_source_type(a)); + unsigned cc = get_attribute_component_count(a); + if(direct) + { + if(integer) + glVertexArrayAttribIFormat(id, sem, cc, type, offset); + else + glVertexArrayAttribFormat(id, sem, cc, type, true, offset); + glVertexArrayAttribBinding(id, sem, binding); + glEnableVertexArrayAttrib(id, sem); + } else - glVertexAttribPointer(sem, cc, type, true, stride, reinterpret_cast(offset)); - if(ARB_instanced_arrays) - glVertexAttribDivisor(sem, divisor); - glEnableVertexAttribArray(sem); + { + if(integer) + glVertexAttribIPointer(sem, cc, type, stride, reinterpret_cast(offset)); + else + glVertexAttribPointer(sem, cc, type, true, stride, reinterpret_cast(offset)); + if(ARB_instanced_arrays) + glVertexAttribDivisor(sem, divisor); + glEnableVertexAttribArray(sem); + } } offset += get_attribute_size(a); } @@ -130,17 +133,19 @@ void OpenGLVertexSetup::unload() glBindBuffer(GL_ARRAY_BUFFER, 0); for(VertexAttribute a: static_cast(this)->vertex_format) - { - unsigned sem = get_attribute_semantic(a); - glDisableVertexAttribArray(sem); - glVertexAttribPointer(sem, 1, GL_FLOAT, false, 0, 0); - } + if(!is_padding(a)) + { + unsigned sem = get_attribute_semantic(a); + glDisableVertexAttribArray(sem); + glVertexAttribPointer(sem, 1, GL_FLOAT, false, 0, 0); + } for(VertexAttribute a: static_cast(this)->inst_format) - { - unsigned sem = get_attribute_semantic(a); - glDisableVertexAttribArray(sem); - glVertexAttribPointer(sem, 1, GL_FLOAT, false, 0, 0); - } + if(!is_padding(a)) + { + unsigned sem = get_attribute_semantic(a); + glDisableVertexAttribArray(sem); + glVertexAttribPointer(sem, 1, GL_FLOAT, false, 0, 0); + } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); }