From c4fa55619539de9045167250d5b1c13d1827cf7a Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 2 Sep 2012 17:32:19 +0300 Subject: [PATCH] Add a helper function for making indexed vertex components This puts the logic for checking the allowable index ranges in one place. The base for an indexed component must now be one with a zero index. It didn't make much sense to add an index to an already indexed component. VertexFormat::offset no longer takes an index, since the helper function can be used. --- source/vertexformat.cpp | 28 ++++++++++++++++++++-------- source/vertexformat.h | 4 +++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/source/vertexformat.cpp b/source/vertexformat.cpp index 0a26d942..ea5845c5 100644 --- a/source/vertexformat.cpp +++ b/source/vertexformat.cpp @@ -77,9 +77,7 @@ VertexFormat VertexFormat::operator,(unsigned i) const throw invalid_operation("VertexFormat::operator,"); VertexFormat r = *this; unsigned char *c = r.data+r.data[0]; - if((*c0) || (*c=8) || i>=53) - throw invalid_argument("VertexFormat::operator,"); - *c += i*4; + *c = make_indexed_component(static_cast(*c), i); return r; } @@ -92,12 +90,9 @@ unsigned VertexFormat::stride() const return s; } -int VertexFormat::offset(VertexComponent comp, unsigned index) const +int VertexFormat::offset(VertexComponent comp) const { - if((comp0) || (comp=8) || index>=53) - throw out_of_range("VertexFormat::offset"); - - unsigned type = get_component_type(comp)+index; + unsigned type = get_component_type(comp); unsigned size = get_component_size(comp); unsigned offs = 0; for(const unsigned char *i=begin(); i!=end(); ++i) @@ -116,6 +111,23 @@ int VertexFormat::offset(VertexComponent comp, unsigned index) const return -1; } +VertexComponent make_indexed_component(VertexComponent comp, unsigned index) +{ + if(comp>=TEXCOORD1 && comp<=TEXCOORD4) + { + if(index>=4) + throw out_of_range("make_indexed_component"); + } + else if(comp>=ATTRIB1 && comp<=ATTRIB4) + { + if(index>=53) + throw out_of_range("make_indexed_component"); + } + else + throw invalid_argument("make_indexed_component"); + return static_cast(comp+index*4); +} + void operator>>(const LexicalConverter &conv, VertexComponent &c) { const string &str = conv.get(); diff --git a/source/vertexformat.h b/source/vertexformat.h index fb47484b..018d21f0 100644 --- a/source/vertexformat.h +++ b/source/vertexformat.h @@ -44,7 +44,7 @@ public: const unsigned char *begin() const { return data ? data+1 : 0; } const unsigned char *end() const { return data ? data+1+data[0] : 0; } unsigned stride() const; - int offset(VertexComponent, unsigned = 0) const; + int offset(VertexComponent) const; }; inline VertexFormat operator,(VertexComponent c1, VertexComponent c2) @@ -53,6 +53,8 @@ inline VertexFormat operator,(VertexComponent c1, VertexComponent c2) inline VertexFormat operator,(VertexComponent c, unsigned i) { return (VertexFormat(c), i); } +VertexComponent make_indexed_component(VertexComponent, unsigned); + inline unsigned get_component_type(unsigned char c) { return c>>2; } -- 2.45.2