X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Fvertexsetup_backend.cpp;h=d45481f996b5eba732c1a1512c7e8d1a3619c077;hp=90189db7227eba94575f99a27fc98ab39e234843;hb=8a8cce8ef4ee28b3572a72958b8b407759f9f826;hpb=160e9eea29bd10034733d59507fa1bcca36be401 diff --git a/source/backends/opengl/vertexsetup_backend.cpp b/source/backends/opengl/vertexsetup_backend.cpp index 90189db7..d45481f9 100644 --- a/source/backends/opengl/vertexsetup_backend.cpp +++ b/source/backends/opengl/vertexsetup_backend.cpp @@ -27,9 +27,16 @@ OpenGLVertexSetup::OpenGLVertexSetup() glGenVertexArrays(1, &id); } +OpenGLVertexSetup::OpenGLVertexSetup(OpenGLVertexSetup &&other): + id(other.id) +{ + other.id = 0; +} + OpenGLVertexSetup::~OpenGLVertexSetup() { - glDeleteVertexArrays(1, &id); + if(id) + glDeleteVertexArrays(1, &id); } void OpenGLVertexSetup::require_format(const VertexFormat &fmt, bool instanced) @@ -80,27 +87,30 @@ void OpenGLVertexSetup::update_vertex_array(const VertexArray &array, unsigned b 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); } @@ -123,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); }