X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbuilders%2Fvertexarraybuilder.cpp;h=6ede4d2ab60f8a417087f0d784ac0b00642c2114;hp=3afe9a40e2bf22c48869207ef9b73235c9dd784b;hb=e92de029768eef5f0fd744329e589161b46d0762;hpb=9904aa3d09458098541fdce0114785d6bce1777f diff --git a/source/builders/vertexarraybuilder.cpp b/source/builders/vertexarraybuilder.cpp index 3afe9a40..6ede4d2a 100644 --- a/source/builders/vertexarraybuilder.cpp +++ b/source/builders/vertexarraybuilder.cpp @@ -17,6 +17,7 @@ void VertexArrayBuilder::vertex_(const Vector4 &vtx) for(const UInt16 *a=format.begin(); a!=format.end(); ++a) { unsigned sem = get_attribute_semantic(*a); + bool integer = is_integer_attribute(*a); DataType type = get_attribute_source_type(*a); unsigned cc = get_attribute_component_count(*a); @@ -24,19 +25,19 @@ void VertexArrayBuilder::vertex_(const Vector4 &vtx) { const Vector4 &value = (sem==0 ? vtx : attr[sem]); if(type==UNSIGNED_BYTE) - store_attribute(ptr, value, cc); + store_attribute(ptr, value, !integer, cc); else if(type==BYTE) - store_attribute(ptr, value, cc); + store_attribute(ptr, value, !integer, cc); else if(type==UNSIGNED_SHORT) - store_attribute(ptr, value, cc); + store_attribute(ptr, value, !integer, cc); else if(type==SHORT) - store_attribute(ptr, value, cc); + store_attribute(ptr, value, !integer, cc); else if(type==UNSIGNED_INT) - store_attribute(ptr, value, cc); + store_attribute(ptr, value, !integer, cc); else if(type==INT) - store_attribute(ptr, value, cc); + store_attribute(ptr, value, !integer, cc); else if(type==FLOAT) - store_attribute(ptr, value, cc); + store_attribute(ptr, value, false, cc); } ptr += get_attribute_size(*a); @@ -44,12 +45,12 @@ void VertexArrayBuilder::vertex_(const Vector4 &vtx) } template -void VertexArrayBuilder::store_attribute(char *ptr, const Vector4 &value, unsigned count) +void VertexArrayBuilder::store_attribute(char *ptr, const Vector4 &value, bool normalize, unsigned count) { T *tptr = reinterpret_cast(ptr); for(unsigned i=0; i::is_integer) + if(!numeric_limits::is_integer || !normalize) *tptr++ = value[i]; else if(numeric_limits::is_signed) *tptr++ = round(min(max(value[i], -1.0f), 1.0f)*numeric_limits::max());