X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvertexformat.cpp;h=e56397e2b088cb93a1204d80027ef875b1c91a73;hb=b617c5d7b5283ad260a77f01e42e6170cabbc03d;hp=232690ede2f99f2c7d1ebb8411d9ad442c68dffa;hpb=b8fef9be469eb16e54068bac7e275ea225efc71c;p=libs%2Fgl.git diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index 232690ed..e56397e2 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions +Copyright © 2007-2010 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ @@ -10,6 +10,8 @@ Distributed under the LGPL #include "except.h" #include "vertexformat.h" +using namespace std; + namespace Msp { namespace GL { @@ -20,8 +22,8 @@ VertexFormat::VertexFormat(): VertexFormat::VertexFormat(VertexComponent c): data(new unsigned char[8]) { - data[0]=1; - data[1]=c; + data[0] = 1; + data[1] = c; } VertexFormat::VertexFormat(const VertexFormat &f): @@ -29,7 +31,7 @@ VertexFormat::VertexFormat(const VertexFormat &f): { if(f.data) { - data=new unsigned char[f.data[0]/8+8]; + data = new unsigned char[f.data[0]/8+8]; memcpy(data, f.data, f.data[0]+1); } } @@ -39,11 +41,11 @@ VertexFormat &VertexFormat::operator=(const VertexFormat &f) delete[] data; if(f.data) { - data=new unsigned char[f.data[0]/8+8]; + data = new unsigned char[f.data[0]/8+8]; memcpy(data, f.data, f.data[0]+1); } else - data=0; + data = 0; return *this; } @@ -53,26 +55,34 @@ 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; +} + VertexFormat operator,(const VertexFormat &f, VertexComponent c) { - VertexFormat r=f; + VertexFormat r = f; if(r.data) { - const unsigned char n=++r.data[0]; + const unsigned char n = ++r.data[0]; if((n&7)==7) { - unsigned char *newdt=new unsigned char[n+9]; + unsigned char *newdt = new unsigned char[n+9]; memcpy(newdt, r.data, n); delete r.data; - r.data=newdt; + r.data = newdt; } - r.data[n]=c; + r.data[n] = c; } else { - r.data=new unsigned char[8]; - r.data[0]=1; - r.data[1]=c; + r.data = new unsigned char[8]; + r.data[0] = 1; + r.data[1] = c; } return r; @@ -82,93 +92,85 @@ 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]; + VertexFormat r = f; + unsigned char *c = r.data+r.data[0]; if(*c28) + if(i>=28) throw InvalidParameterValue("Generic attribute index out of range"); - *c+=(i-1)*4; + *c += i*4; return r; } -uint get_stride(const VertexFormat &f) -{ - uint stride=0; - for(const unsigned char *i=f.begin(); i!=f.end(); ++i) - stride+=(*i&3)+1; - return stride; -} - -std::istream &operator>>(std::istream &in, VertexFormat &f) +istream &operator>>(istream &in, VertexFormat &f) { - std::string str; + string str; in>>str; - unsigned start=0; + unsigned start = 0; while(1) { - unsigned underscore=str.find('_', start); - bool fail=false; + string::size_type underscore = str.find('_', start); + bool fail = false; if(!str.compare(start, underscore-start, "VERTEX2")) - f=(f,VERTEX2); + f = (f,VERTEX2); else if(!str.compare(start, underscore-start, "VERTEX3")) - f=(f,VERTEX3); + f = (f,VERTEX3); else if(!str.compare(start, underscore-start, "VERTEX4")) - f=(f,VERTEX4); + f = (f,VERTEX4); else if(!str.compare(start, underscore-start, "NORMAL3")) - f=(f,NORMAL3); + f = (f,NORMAL3); else if(!str.compare(start, underscore-start, "TEXCOORD1")) - f=(f,TEXCOORD1); + f = (f,TEXCOORD1); else if(!str.compare(start, underscore-start, "TEXCOORD2")) - f=(f,TEXCOORD2); + f = (f,TEXCOORD2); else if(!str.compare(start, underscore-start, "TEXCOORD3")) - f=(f,TEXCOORD3); + f = (f,TEXCOORD3); else if(!str.compare(start, underscore-start, "TEXCOORD4")) - f=(f,TEXCOORD4); + f = (f,TEXCOORD4); else if(!str.compare(start, underscore-start, "COLOR4UB")) - f=(f,COLOR4_UBYTE); + f = (f,COLOR4_UBYTE); else if(!str.compare(start, underscore-start, "COLOR3F")) - f=(f,COLOR3_FLOAT); + f = (f,COLOR3_FLOAT); else if(!str.compare(start, underscore-start, "COLOR4F")) - f=(f,COLOR4_FLOAT); + f = (f,COLOR4_FLOAT); else if(underscore>=start+8 && !str.compare(start, 6, "ATTRIB")) { try { - char n=str[start+6]; - unsigned i=lexical_cast(str.substr(start+7, underscore-start-7)); + char n = str[start+6]; + unsigned i = lexical_cast(str.substr(start+7, underscore-start-7)); if(n=='1') - f=(f,ATTRIB1,i); + f = (f,ATTRIB1,i); else if(n=='2') - f=(f,ATTRIB2,i); + f = (f,ATTRIB2,i); else if(n=='3') - f=(f,ATTRIB3,i); + f = (f,ATTRIB3,i); else if(n=='4') - f=(f,ATTRIB4,i); + f = (f,ATTRIB4,i); else - fail=true; + fail = true; } catch(const LexicalError &) { - fail=true; + fail = true; } } else - fail=true; + fail = true; if(fail) { - in.setstate(std::ios_base::failbit); + in.setstate(ios_base::failbit); break; } - if(underscore==std::string::npos) + if(underscore==string::npos) break; - start=underscore+1; + start = underscore+1; } return in;