#include "buffer.h"
#include "error.h"
#include "gl.h"
+#include "misc.h"
#include "vertexarray.h"
#include "vertexsetup.h"
void VertexSetup::set_vertex_array(const VertexArray &a)
{
- if(!a.get_buffer())
+ if(!verify_array(a))
throw invalid_argument("VertexSetup::set_vertex_array");
vertex_array = &a;
{
if(a)
{
- if(!a->get_buffer())
+ if(!verify_array(*a))
throw invalid_argument("VertexSetup::set_instance_array");
static Require req(ARB_instanced_arrays);
set_instance_array(inst_array);
}
+bool VertexSetup::verify_array(const VertexArray &array)
+{
+ if(!array.get_buffer())
+ return false;
+
+ static int max_attribs = -1;
+ if(max_attribs<0)
+ max_attribs = get_i(GL_MAX_VERTEX_ATTRIBS);
+
+ const VertexFormat &fmt = array.get_format();
+ for(const unsigned char *a=fmt.begin(); a!=fmt.end(); ++a)
+ if(static_cast<int>(get_attribute_semantic(*a))>=max_attribs)
+ return false;
+
+ return true;
+}
+
unsigned VertexSetup::get_attribs(const VertexFormat &fmt)
{
unsigned mask = 0;