X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=ea5845c5fc10f56cca9b217a6db5c405e9b0028c;hb=c4fa55619539de9045167250d5b1c13d1827cf7a;hp=e3f8bf97a5c49e5fe245975d09308de0e57295c9;hpb=b250a711295f5ba00114f11a5b1c855eebe08d26;p=libs%2Fgl.git diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index e3f8bf97..ea5845c5 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -24,11 +24,7 @@ VertexFormat::VertexFormat(VertexComponent c): VertexFormat::VertexFormat(const VertexFormat &f): data(0) { - if(f.data) - { - data = new unsigned char[(f.data[0]&~7)+8]; - memcpy(data, f.data, f.data[0]+1); - } + *this = f; } VertexFormat &VertexFormat::operator=(const VertexFormat &f) @@ -37,7 +33,7 @@ VertexFormat &VertexFormat::operator=(const VertexFormat &f) if(f.data) { data = new unsigned char[(f.data[0]&~7)+8]; - memcpy(data, f.data, f.data[0]+1); + copy(f.data, f.data+f.data[0]+1, data); } else data = 0; @@ -50,74 +46,86 @@ VertexFormat::~VertexFormat() delete[] data; } +VertexFormat VertexFormat::operator,(VertexComponent c) const +{ + VertexFormat r = *this; + if(r.data) + { + const unsigned char n = ++r.data[0]; + if((n&7)==0) + { + unsigned char *newdt = new unsigned char[n+8]; + copy(r.data, r.data+n, newdt); + delete r.data; + r.data = newdt; + } + r.data[n] = c; + } + else + { + r.data = new unsigned char[8]; + r.data[0] = 1; + r.data[1] = c; + } + + return r; +} + +VertexFormat VertexFormat::operator,(unsigned i) const +{ + if(!data) + throw invalid_operation("VertexFormat::operator,"); + VertexFormat r = *this; + unsigned char *c = r.data+r.data[0]; + *c = make_indexed_component(static_cast(*c), i); + + return r; +} + unsigned VertexFormat::stride() const { unsigned s = 0; for(const unsigned char *i=begin(); i!=end(); ++i) - s += (*i&3)+1; + s += get_component_size(*i); return s; } -int VertexFormat::offset(VertexComponent comp, unsigned index) const +int VertexFormat::offset(VertexComponent comp) const { - if((comp0) || (comp=8) || index>=53) - throw out_of_range("VertexFormat::offset"); - - unsigned type = (comp>>2)+index; - unsigned size = comp&3; + unsigned type = get_component_type(comp); + unsigned size = get_component_size(comp); unsigned offs = 0; for(const unsigned char *i=begin(); i!=end(); ++i) { - if(static_cast(*i>>2)==type) + if(get_component_type(*i)==type) { - if((*i&3)>=size) + if(get_component_size(*i)>=size) return offs; else return -1; } else - offs += (*i&3)+1; + offs += get_component_size(*i); } return -1; } -VertexFormat operator,(const VertexFormat &f, VertexComponent c) +VertexComponent make_indexed_component(VertexComponent comp, unsigned index) { - VertexFormat r = f; - if(r.data) + if(comp>=TEXCOORD1 && comp<=TEXCOORD4) { - const unsigned char n = ++r.data[0]; - if((n&7)==7) - { - unsigned char *newdt = new unsigned char[n+9]; - memcpy(newdt, r.data, n); - delete r.data; - r.data = newdt; - } - r.data[n] = c; + if(index>=4) + throw out_of_range("make_indexed_component"); } - else + else if(comp>=ATTRIB1 && comp<=ATTRIB4) { - r.data = new unsigned char[8]; - r.data[0] = 1; - r.data[1] = c; + if(index>=53) + throw out_of_range("make_indexed_component"); } - - return r; -} - -VertexFormat operator,(const VertexFormat &f, unsigned i) -{ - if(!f.data) - throw invalid_operation("VertexFormat::operator,"); - VertexFormat r = f; - unsigned char *c = r.data+r.data[0]; - if((*c0) || (*c=8) || i>=53) - throw invalid_argument("VertexFormat::operator,"); - *c += i*4; - - return r; + else + throw invalid_argument("make_indexed_component"); + return static_cast(comp+index*4); } void operator>>(const LexicalConverter &conv, VertexComponent &c)