X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=e3f8bf97a5c49e5fe245975d09308de0e57295c9;hb=b250a711295f5ba00114f11a5b1c855eebe08d26;hp=2b18178b26db4734bcc3e3f673abb32324a10779;hpb=f1cbab0dca940fd5db6d459f9e91661efe3d6052;p=libs%2Fgl.git diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index 2b18178b..e3f8bf97 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -1,14 +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 "error.h" #include "vertexformat.h" using namespace std; @@ -64,6 +58,30 @@ unsigned VertexFormat::stride() const return s; } +int VertexFormat::offset(VertexComponent comp, unsigned index) const +{ + if((comp0) || (comp=8) || index>=53) + throw out_of_range("VertexFormat::offset"); + + unsigned type = (comp>>2)+index; + unsigned size = comp&3; + unsigned offs = 0; + for(const unsigned char *i=begin(); i!=end(); ++i) + { + if(static_cast(*i>>2)==type) + { + if((*i&3)>=size) + return offs; + else + return -1; + } + else + offs += (*i&3)+1; + } + + return -1; +} + VertexFormat operator,(const VertexFormat &f, VertexComponent c) { VertexFormat r = f; @@ -92,11 +110,11 @@ VertexFormat operator,(const VertexFormat &f, VertexComponent c) VertexFormat operator,(const VertexFormat &f, unsigned i) { if(!f.data) - throw InvalidState("VertexFormat has no components"); + throw invalid_operation("VertexFormat::operator,"); VertexFormat r = f; unsigned char *c = r.data+r.data[0]; if((*c0) || (*c=8) || i>=53) - throw InvalidParameterValue("Vertex component index out of range"); + throw invalid_argument("VertexFormat::operator,"); *c += i*4; return r; @@ -120,7 +138,7 @@ void operator>>(const LexicalConverter &conv, VertexComponent &c) 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 LexicalError("Invalid texture unit in VertexComponent conversion"); + 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]=='_') { @@ -129,14 +147,14 @@ void operator>>(const LexicalConverter &conv, VertexComponent &c) { n = lexical_cast(str.substr(8)); } - catch(const LexicalError &) + catch(const lexical_error &) { - throw LexicalError("Invalid attribute in VertexComponent conversion"); + throw lexical_error(format("conversion of '%s' to VertexComponent", str)); } c = static_cast(ATTRIB1+(str[6]-'1')+n*4); } else - throw LexicalError("Invalid input in VertexComponent conversion"); + throw lexical_error(format("conversion of '%s' to VertexComponent", str)); } // XXX This will go away eventually