X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fvertexsetup.cpp;h=f6f0f58b65397cabdba6f9cbdc42bf027503689d;hb=6d33ca40415937790ed0cddc97148b5fbd90ccaf;hp=0cbe9a921a3dce33fc9190fbec59abc33654c719;hpb=2815449aa1c2a3c813f50ff85325cc2a3334430c;p=libs%2Fgl.git diff --git a/source/core/vertexsetup.cpp b/source/core/vertexsetup.cpp index 0cbe9a92..f6f0f58b 100644 --- a/source/core/vertexsetup.cpp +++ b/source/core/vertexsetup.cpp @@ -8,6 +8,7 @@ #include "buffer.h" #include "error.h" #include "gl.h" +#include "misc.h" #include "vertexarray.h" #include "vertexsetup.h" @@ -38,7 +39,7 @@ VertexSetup::~VertexSetup() 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; @@ -50,7 +51,7 @@ void VertexSetup::set_instance_array(const VertexArray *a) { if(a) { - if(!a->get_buffer()) + if(!verify_array(*a)) throw invalid_argument("VertexSetup::set_instance_array"); static Require req(ARB_instanced_arrays); @@ -76,6 +77,23 @@ void VertexSetup::refresh() 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(get_attribute_semantic(*a))>=max_attribs) + return false; + + return true; +} + unsigned VertexSetup::get_attribs(const VertexFormat &fmt) { unsigned mask = 0;