X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=1de430870d6a328d363b169f0fb53125bde2614a;hb=43c6495ff3d14a85ee5de169a80fdacf13b7147e;hp=dc8ff23eeaa2a7b52f194ef72c94a11c705d5f77;hpb=4443707c752ab8ee288f1c22be08cf82f27439d7;p=libs%2Fgl.git diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index dc8ff23e..1de43087 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -1,13 +1,8 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007-2010 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - -#include +#include +#include #include -#include "except.h" +#include +#include "error.h" #include "vertexformat.h" using namespace std; @@ -29,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) @@ -42,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; @@ -55,24 +46,16 @@ VertexFormat::~VertexFormat() delete[] data; } -unsigned VertexFormat::stride() const +VertexFormat VertexFormat::operator,(VertexComponent c) const { - unsigned s = 0; - for(const unsigned char *i=begin(); i!=end(); ++i) - s += (*i&3)+1; - return s; -} - -VertexFormat operator,(const VertexFormat &f, VertexComponent c) -{ - VertexFormat r = f; + VertexFormat r = *this; 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; } @@ -88,89 +71,98 @@ VertexFormat operator,(const VertexFormat &f, VertexComponent c) return r; } -VertexFormat operator,(const VertexFormat &f, unsigned i) +VertexFormat VertexFormat::operator,(unsigned i) const { - if(!f.data) - throw InvalidState("VertexFormat has no components"); - VertexFormat r = f; + if(!data) + throw invalid_operation("VertexFormat::operator,"); + VertexFormat r = *this; unsigned char *c = r.data+r.data[0]; - if((*c0) || (*c=8) || i>=53) - throw InvalidParameterValue("Vertex component index out of range"); - *c += i*4; + *c = make_indexed_component(static_cast(*c), i); return r; } -istream &operator>>(istream &in, VertexFormat &f) +unsigned VertexFormat::stride() const { - string str; - in>>str; - - unsigned start = 0; + unsigned s = 0; + for(const unsigned char *i=begin(); i!=end(); ++i) + s += get_component_size(*i); + return s; +} - while(1) +int VertexFormat::offset(VertexComponent comp) const +{ + unsigned type = get_component_type(comp); + unsigned size = get_component_size(comp); + unsigned offs = 0; + for(const unsigned char *i=begin(); i!=end(); ++i) { - string::size_type underscore = str.find('_', start); - bool fail = false; - if(!str.compare(start, underscore-start, "VERTEX2")) - f = (f,VERTEX2); - else if(!str.compare(start, underscore-start, "VERTEX3")) - f = (f,VERTEX3); - else if(!str.compare(start, underscore-start, "VERTEX4")) - f = (f,VERTEX4); - else if(!str.compare(start, underscore-start, "NORMAL3")) - f = (f,NORMAL3); - else if(!str.compare(start, underscore-start, "TEXCOORD1")) - f = (f,TEXCOORD1); - else if(!str.compare(start, underscore-start, "TEXCOORD2")) - f = (f,TEXCOORD2); - else if(!str.compare(start, underscore-start, "TEXCOORD3")) - f = (f,TEXCOORD3); - else if(!str.compare(start, underscore-start, "TEXCOORD4")) - f = (f,TEXCOORD4); - else if(!str.compare(start, underscore-start, "COLOR4UB")) - f = (f,COLOR4_UBYTE); - else if(!str.compare(start, underscore-start, "COLOR3F")) - f = (f,COLOR3_FLOAT); - else if(!str.compare(start, underscore-start, "COLOR4F")) - f = (f,COLOR4_FLOAT); - else if(underscore>=start+8 && !str.compare(start, 6, "ATTRIB")) + if(get_component_type(*i)==type) { - try - { - char n = str[start+6]; - unsigned i = lexical_cast(str.substr(start+7, underscore-start-7)); - if(n=='1') - f = (f,ATTRIB1,i); - else if(n=='2') - f = (f,ATTRIB2,i); - else if(n=='3') - f = (f,ATTRIB3,i); - else if(n=='4') - f = (f,ATTRIB4,i); - else - fail = true; - } - catch(const LexicalError &) - { - fail = true; - } + if(get_component_size(*i)>=size) + return offs; + else + return -1; } else - fail = true; + offs += get_component_size(*i); + } - if(fail) - { - in.setstate(ios_base::failbit); - break; - } + return -1; +} - if(underscore==string::npos) - break; - start = underscore+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); +} - return in; +void operator>>(const LexicalConverter &conv, VertexComponent &c) +{ + const string &str = conv.get(); + if(str.size()==7 && !str.compare(0, 6, "VERTEX") && str[6]>='2' && str[6]<='4') + c = static_cast(VERTEX2+(str[6]-'2')); + else if(str=="NORMAL3") + c = NORMAL3; + else if(str.size()==12 && !str.compare(0, 5, "COLOR") && str[5]>='3' && str[5]<='4' && !str.compare(6, 6, "_FLOAT")) + c = static_cast(COLOR3_FLOAT+(str[5]-'3')); + else if(str=="COLOR4_UBYTE") + c = COLOR4_UBYTE; + else if(str.size()>=9 && !str.compare(0, 8, "TEXCOORD") && str[8]>='1' && str[8]<='4') + { + if(str.size()==9) + c = static_cast(TEXCOORD1+(str[8]-'1')); + else if(str.size()==11 && str[9]=='_' && str[10]>='0' && str[10]<='7') + c = static_cast(TEXCOORD1+(str[8]-'1')+(str[10]-'0')*4); + else + throw lexical_error(format("conversion of '%s' to VertexComponent", str)); + } + else if(str.size()>=9 && !str.compare(0, 6, "ATTRIB") && str[6]>='1' && str[6]<='4' && str[7]=='_') + { + unsigned n; + try + { + n = lexical_cast(str.substr(8)); + } + catch(const lexical_error &) + { + throw lexical_error(format("conversion of '%s' to VertexComponent", str)); + } + c = static_cast(ATTRIB1+(str[6]-'1')+n*4); + } + else + throw lexical_error(format("conversion of '%s' to VertexComponent", str)); } } // namespace GL