X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=146fc68095be688e4c974c3aefbccf89c71b0b7e;hb=40c364b04084d11573a9ff9f7be6f1c4cc521f4b;hp=65b276baa7115e5c5482fc0b39ac0a1ed4f85cb4;hpb=ba5c731b8aa6430bb10e38848d42d8bfb59694a6;p=libs%2Fgl.git diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index 65b276ba..146fc680 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; @@ -56,10 +52,10 @@ VertexFormat VertexFormat::operator,(VertexComponent c) const if(r.data) { const unsigned char n = ++r.data[0]; - if((n&7)==7) + if((n&7)==0) { - unsigned char *newdt = new unsigned char[n+9]; - memcpy(newdt, r.data, n); + unsigned char *newdt = new unsigned char[n+8]; + copy(r.data, r.data+n, newdt); delete r.data; r.data = newdt; } @@ -81,9 +77,7 @@ VertexFormat VertexFormat::operator,(unsigned i) const throw invalid_operation("VertexFormat::operator,"); VertexFormat r = *this; unsigned char *c = r.data+r.data[0]; - if((*c0) || (*c=8) || i>=53) - throw invalid_argument("VertexFormat::operator,"); - *c += i*4; + *c = make_indexed_component(static_cast(*c), i); return r; } @@ -96,12 +90,9 @@ unsigned VertexFormat::stride() const 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 = get_component_type(comp)+index; + unsigned type = get_component_type(comp); unsigned size = get_component_size(comp); unsigned offs = 0; for(const unsigned char *i=begin(); i!=end(); ++i) @@ -120,6 +111,23 @@ int VertexFormat::offset(VertexComponent comp, unsigned index) const return -1; } +VertexComponent make_indexed_component(VertexComponent comp, unsigned index) +{ + if(comp>=TEXCOORD1 && comp<=TEXCOORD4) + { + if(index>=4) + throw out_of_range("make_indexed_component"); + } + else if(comp>=ATTRIB1 && comp<=ATTRIB4) + { + if(index>=24) + throw out_of_range("make_indexed_component"); + } + else + throw invalid_argument("make_indexed_component"); + return static_cast(comp+index*4); +} + void operator>>(const LexicalConverter &conv, VertexComponent &c) { const string &str = conv.get();