- union { unsigned char c[4]; float f; } u;
- u.c[0] = static_cast<unsigned char>(attr[sem].x*255);
- u.c[1] = static_cast<unsigned char>(attr[sem].y*255);
- u.c[2] = static_cast<unsigned char>(attr[sem].z*255);
- u.c[3] = static_cast<unsigned char>(attr[sem].w*255);
- *ptr++ = u.f;
+ bool integer = is_integer_attribute(a);
+ DataType type = get_attribute_source_type(a);
+ unsigned cc = get_attribute_component_count(a);
+
+ const Vector4 &value = (sem==0 ? vtx : attr[sem]);
+ if(type==UNSIGNED_BYTE)
+ store_attribute<uint8_t>(ptr, value, !integer, cc);
+ else if(type==BYTE)
+ store_attribute<int8_t>(ptr, value, !integer, cc);
+ else if(type==UNSIGNED_SHORT)
+ store_attribute<uint16_t>(ptr, value, !integer, cc);
+ else if(type==SHORT)
+ store_attribute<int16_t>(ptr, value, !integer, cc);
+ else if(type==UNSIGNED_INT)
+ store_attribute<uint32_t>(ptr, value, !integer, cc);
+ else if(type==INT)
+ store_attribute<int32_t>(ptr, value, !integer, cc);
+ else if(type==FLOAT)
+ store_attribute<float>(ptr, value, false, cc);