X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=0a26d94268847b94d443bcf6e9d47192936d1722;hb=77656543441a130276e0a37ba119270edd9156ff;hp=adb33c2afa48178d794a0476263a8d029f8519ac;hpb=c254bc3ed8df9c4113c975bdd119f127d8360f86;p=libs%2Fgl.git diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index adb33c2a..0a26d942 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 -#include "except.h" +#include "error.h" #include "vertexformat.h" using namespace std; @@ -30,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) @@ -43,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,48 +46,16 @@ VertexFormat::~VertexFormat() delete[] data; } -unsigned VertexFormat::stride() const -{ - unsigned s = 0; - for(const unsigned char *i=begin(); i!=end(); ++i) - s += (*i&3)+1; - return s; -} - -int VertexFormat::offset(VertexComponent comp, unsigned index) const -{ - if((comp0) || (comp=8) || index>=53) - throw InvalidParameterValue("Vertex component index out of range"); - - unsigned type = (comp>>2)+index; - unsigned size = comp&3; - unsigned offs = 0; - for(const unsigned char *i=begin(); i!=end(); ++i) - { - if((*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 VertexFormat::operator,(VertexComponent c) const { - 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; } @@ -113,19 +71,51 @@ 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"); + throw invalid_argument("VertexFormat::operator,"); *c += i*4; return r; } +unsigned VertexFormat::stride() const +{ + unsigned s = 0; + for(const unsigned char *i=begin(); i!=end(); ++i) + s += get_component_size(*i); + return s; +} + +int VertexFormat::offset(VertexComponent comp, unsigned index) const +{ + if((comp0) || (comp=8) || index>=53) + throw out_of_range("VertexFormat::offset"); + + unsigned type = get_component_type(comp)+index; + unsigned size = get_component_size(comp); + unsigned offs = 0; + for(const unsigned char *i=begin(); i!=end(); ++i) + { + if(get_component_type(*i)==type) + { + if(get_component_size(*i)>=size) + return offs; + else + return -1; + } + else + offs += get_component_size(*i); + } + + return -1; +} + void operator>>(const LexicalConverter &conv, VertexComponent &c) { const string &str = conv.get(); @@ -144,7 +134,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]=='_') { @@ -153,14 +143,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