]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/opengl/vertexsetup_backend.cpp
Add support for padding in vertex formats
[libs/gl.git] / source / backends / opengl / vertexsetup_backend.cpp
index 90189db7227eba94575f99a27fc98ab39e234843..d45481f996b5eba732c1a1512c7e8d1a3619c077 100644 (file)
@@ -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<void *>(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<void *>(offset));
-                       if(ARB_instanced_arrays)
-                               glVertexAttribDivisor(sem, divisor);
-                       glEnableVertexAttribArray(sem);
+                       {
+                               if(integer)
+                                       glVertexAttribIPointer(sem, cc, type, stride, reinterpret_cast<void *>(offset));
+                               else
+                                       glVertexAttribPointer(sem, cc, type, true, stride, reinterpret_cast<void *>(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<const VertexSetup *>(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<const VertexSetup *>(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);
        }