X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=037305f8d74251c9e6cd882540df733e292afc30;hp=f5e175714187a9eb5a853abc9ba84aa3728864a9;hb=HEAD;hpb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8 diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp deleted file mode 100644 index f5e17571..00000000 --- a/source/vertexformat.cpp +++ /dev/null @@ -1,180 +0,0 @@ -#include -#include -#include -#include "except.h" -#include "vertexformat.h" - -using namespace std; - -namespace Msp { -namespace GL { - -VertexFormat::VertexFormat(): - data(0) -{ } - -VertexFormat::VertexFormat(VertexComponent c): - data(new unsigned char[8]) -{ - data[0] = 1; - data[1] = 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); - } -} - -VertexFormat &VertexFormat::operator=(const VertexFormat &f) -{ - delete[] data; - if(f.data) - { - data = new unsigned char[(f.data[0]&~7)+8]; - memcpy(data, f.data, f.data[0]+1); - } - else - data = 0; - - return *this; -} - -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(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; - if(r.data) - { - const unsigned char n = ++r.data[0]; - if((n&7)==7) - { - unsigned char *newdt = new unsigned char[n+9]; - memcpy(newdt, r.data, n); - 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; - } - - return r; -} - -VertexFormat operator,(const VertexFormat &f, unsigned i) -{ - if(!f.data) - throw InvalidState("VertexFormat has no components"); - 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"); - *c += i*4; - - return r; -} - -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 LexicalError("Invalid texture unit in VertexComponent conversion"); - } - 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 LexicalError &) - { - throw LexicalError("Invalid attribute in VertexComponent conversion"); - } - c = static_cast(ATTRIB1+(str[6]-'1')+n*4); - } - else - throw LexicalError("Invalid input in VertexComponent conversion"); -} - -// 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