X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=8cc0cec990157719b87ffe70e640b4c579829f77;hb=ccbfdfa0d9d796244b1ecc0fa3faa2c50304811b;hp=0a26d94268847b94d443bcf6e9d47192936d1722;hpb=77656543441a130276e0a37ba119270edd9156ff;p=libs%2Fgl.git diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index 0a26d942..8cc0cec9 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -77,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; } @@ -92,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) @@ -116,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(); @@ -127,6 +139,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) @@ -153,25 +169,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