From f1cbab0dca940fd5db6d459f9e91661efe3d6052 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 3 Feb 2011 21:21:29 +0000 Subject: [PATCH] Support multiple sets of texture coordinates in datafiles --- source/vertexarray.cpp | 5 ++ source/vertexformat.cpp | 108 +++++++++++++++++----------------------- source/vertexformat.h | 3 +- 3 files changed, 54 insertions(+), 62 deletions(-) diff --git a/source/vertexarray.cpp b/source/vertexarray.cpp index 54de0c0d..25ec3f59 100644 --- a/source/vertexarray.cpp +++ b/source/vertexarray.cpp @@ -162,6 +162,7 @@ void VertexArray::apply() const if(i>3 || active_tex) glClientActiveTexture(GL_TEXTURE0+(i-3)); glDisableClientState(GL_TEXTURE_COORD_ARRAY); + active_tex = i-3; } else glDisableVertexAttribArrayARB(i-11); @@ -228,6 +229,10 @@ VertexArray::Loader::Loader(VertexArray &a): add("texcoord2", static_cast(&Loader::texcoord)); add("texcoord3", static_cast(&Loader::texcoord)); add("texcoord4", static_cast(&Loader::texcoord)); + add("multitexcoord1", static_cast(&Loader::multitexcoord)); + add("multitexcoord2", static_cast(&Loader::multitexcoord)); + add("multitexcoord3", static_cast(&Loader::multitexcoord)); + add("multitexcoord4", static_cast(&Loader::multitexcoord)); add("color3", static_cast(&Loader::color)); add("color4", static_cast(&Loader::color)); add("attrib1", static_cast(&Loader::attrib)); diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index dc8ff23e..2b18178b 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -7,6 +7,7 @@ Distributed under the LGPL #include #include +#include #include "except.h" #include "vertexformat.h" @@ -101,76 +102,61 @@ VertexFormat operator,(const VertexFormat &f, unsigned i) return r; } -istream &operator>>(istream &in, VertexFormat &f) +void operator>>(const LexicalConverter &conv, VertexComponent &c) { - string str; - in>>str; - - unsigned start = 0; - - while(1) + 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]=='_') { - 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")) + unsigned n; + try { - 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; - } + n = lexical_cast(str.substr(8)); } - else - fail = true; - - if(fail) + catch(const LexicalError &) { - in.setstate(ios_base::failbit); - break; + throw LexicalError("Invalid attribute in VertexComponent conversion"); } + c = static_cast(ATTRIB1+(str[6]-'1')+n*4); + } + else + throw LexicalError("Invalid input in VertexComponent conversion"); +} - if(underscore==string::npos) - break; - start = underscore+1; +// 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); } - return in; + for(vector::iterator i=parts.begin(); i!=parts.end(); ++i) + f = (f, lexical_cast(*i)); } } // namespace GL diff --git a/source/vertexformat.h b/source/vertexformat.h index 4dc780b2..53562ef9 100644 --- a/source/vertexformat.h +++ b/source/vertexformat.h @@ -59,7 +59,8 @@ inline VertexFormat operator,(VertexComponent c, unsigned i) inline unsigned get_stride(const VertexFormat &f) { return f.stride(); } -std::istream &operator>>(std::istream &, VertexFormat &); +void operator>>(const LexicalConverter &, VertexComponent &); +void operator>>(const LexicalConverter &, VertexFormat &); } // namespace GL } // namespace Msp -- 2.43.0