X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=037305f8d74251c9e6cd882540df733e292afc30;hp=ea5845c5fc10f56cca9b217a6db5c405e9b0028c;hb=d901696935a6bf9fdad6ac8abe65ffab79bd297d;hpb=c4fa55619539de9045167250d5b1c13d1827cf7a diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index ea5845c5..037305f8 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -11,72 +11,33 @@ namespace Msp { namespace GL { VertexFormat::VertexFormat(): - data(0) + count(0) { } VertexFormat::VertexFormat(VertexComponent c): - data(new unsigned char[8]) + count(1) { - data[0] = 1; - data[1] = c; -} - -VertexFormat::VertexFormat(const VertexFormat &f): - data(0) -{ - *this = f; -} - -VertexFormat &VertexFormat::operator=(const VertexFormat &f) -{ - delete[] data; - if(f.data) - { - data = new unsigned char[(f.data[0]&~7)+8]; - copy(f.data, f.data+f.data[0]+1, data); - } - else - data = 0; - - return *this; -} - -VertexFormat::~VertexFormat() -{ - delete[] data; + components[0] = c; } VertexFormat VertexFormat::operator,(VertexComponent c) const { + if(count>=MAX_COMPONENTS) + throw invalid_operation("VertexFormat::operator,"); + 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; - } + r.components[r.count++] = c; return r; } VertexFormat VertexFormat::operator,(unsigned i) const { - if(!data) + if(!count) throw invalid_operation("VertexFormat::operator,"); + VertexFormat r = *this; - unsigned char *c = r.data+r.data[0]; + unsigned char *c = &r.components[r.count-1]; *c = make_indexed_component(static_cast(*c), i); return r; @@ -120,7 +81,7 @@ VertexComponent make_indexed_component(VertexComponent comp, unsigned index) } else if(comp>=ATTRIB1 && comp<=ATTRIB4) { - if(index>=53) + if(index>=24) throw out_of_range("make_indexed_component"); } else @@ -139,6 +100,10 @@ void operator>>(const LexicalConverter &conv, VertexComponent &c) c = static_cast(COLOR3_FLOAT+(str[5]-'3')); else if(str=="COLOR4_UBYTE") c = COLOR4_UBYTE; + else if(str=="TANGENT3") + c = TANGENT3; + else if(str=="BINORMAL3") + c = BINORMAL3; else if(str.size()>=9 && !str.compare(0, 8, "TEXCOORD") && str[8]>='1' && str[8]<='4') { if(str.size()==9) @@ -165,25 +130,5 @@ void operator>>(const LexicalConverter &conv, VertexComponent &c) throw lexical_error(format("conversion of '%s' to VertexComponent", str)); } -// XXX This will go away eventually -void operator>>(const LexicalConverter &conv, VertexFormat &f) -{ - vector parts = split(conv.get(), '_'); - for(vector::iterator i=parts.begin(); i!=parts.end(); ++i) - { - if(*i=="COLOR4UB") - *i = "COLOR4_UBYTE"; - else if(i->size()==7 && !i->compare(0, 5, "COLOR") && (*i)[6]=='F') - *i = i->substr(0, 6)+"_FLOAT"; - else if(i->size()>=10 && !i->compare(0, 8, "TEXCOORD")) - *i = i->substr(0, 9)+"_"+i->substr(9); - else if(i->size()>=8 && !i->compare(0, 6, "ATTRIB")) - *i = i->substr(0, 7)+"_"+i->substr(7); - } - - for(vector::iterator i=parts.begin(); i!=parts.end(); ++i) - f = (f, lexical_cast(*i)); -} - } // namespace GL } // namespace Msp