+void VertexSetup::refresh()
+{
+ if(vertex_array && vertex_array->get_format()!=vertex_format)
+ set_vertex_array(*vertex_array);
+
+ if(inst_array && inst_array->get_format()!=inst_format)
+ set_instance_array(inst_array);
+}
+
+unsigned VertexSetup::get_attribs(const VertexFormat &fmt)
+{
+ unsigned mask = 0;
+ for(const unsigned char *c=fmt.begin(); c!=fmt.end(); ++c)
+ {
+ unsigned t = get_component_type(*c);
+ if(t>=get_component_type(ATTRIB1))
+ t -= get_component_type(ATTRIB1);
+ mask |= 1<<t;
+ }
+ return mask;
+}
+
+unsigned VertexSetup::get_update_mask(unsigned base, const VertexFormat &cur_fmt, const VertexArray &new_array)
+{
+ unsigned unused = get_attribs(cur_fmt)&~get_attribs(new_array.get_format());
+ return base | (unused ? UNUSED_ATTRIBS | (unused<<ATTRIB_SHIFT) : 0);
+}
+