From 7f03ee52e8af5f857e44702b6d1c2822a51c62ef Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 21 Mar 2021 11:21:35 +0200 Subject: [PATCH] Refactor vertex builders All attributes are now stored in a single vector. --- source/builders/primitivebuilder.cpp | 13 +++---- source/builders/vertexarraybuilder.cpp | 48 ++++++++------------------ source/builders/vertexbuilder.h | 36 ++++++++----------- 3 files changed, 36 insertions(+), 61 deletions(-) diff --git a/source/builders/primitivebuilder.cpp b/source/builders/primitivebuilder.cpp index dd869908..4b88618a 100644 --- a/source/builders/primitivebuilder.cpp +++ b/source/builders/primitivebuilder.cpp @@ -59,12 +59,13 @@ PrimitiveType PrimitiveBuilder::get_type() const void PrimitiveBuilder::vertex_(const Vector4 &v) { - vab.color(col); - vab.normal(nor); - for(std::map::iterator i=texc.begin(); i!=texc.end(); ++i) - vab.multitexcoord(i->first, i->second); - for(std::map::iterator i=attr.begin(); i!=attr.end(); ++i) - vab.attrib(i->first, i->second); + const VertexFormat &format = array.get_format(); + for(const unsigned char *c=format.begin(); c!=format.end(); ++c) + { + unsigned t = get_component_type(*c); + if(t=attr.size()) + ptr += sz; + else if(*c==COLOR4_UBYTE) { union { unsigned char c[4]; float f; } u; - u.c[0] = static_cast(col.r*255); - u.c[1] = static_cast(col.g*255); - u.c[2] = static_cast(col.b*255); - u.c[3] = static_cast(col.a*255); + u.c[0] = static_cast(attr[t].x*255); + u.c[1] = static_cast(attr[t].y*255); + u.c[2] = static_cast(attr[t].z*255); + u.c[3] = static_cast(attr[t].w*255); *ptr++ = u.f; } - else if(*c==NORMAL3) - { - *ptr++ = nor.x; - *ptr++ = nor.y; - *ptr++ = nor.z; - } - else if(t==get_component_type(COLOR4_FLOAT)) - { - *ptr++ = col.r; - *ptr++ = col.g; - *ptr++ = col.b; - if(sz>=4) *ptr++ = col.a; - } else { - const Vector4 *v = 0; - if(t==get_component_type(VERTEX3)) - v = &ver; - else if(*c>=TEXCOORD1 && *c<=TEXCOORD4+12) - v = &texc[t-get_component_type(TEXCOORD1)]; - else if(*c>=ATTRIB1) - v = &attr[t-get_component_type(ATTRIB1)]; - else - v = &attr[t]; - *ptr++ = v->x; - if(sz>=2) *ptr++ = v->y; - if(sz>=3) *ptr++ = v->z; - if(sz>=4) *ptr++ = v->w; + const Vector4 &v = (t==0 ? vtx : attr[t]); + *ptr++ = v.x; + if(sz>=2) *ptr++ = v.y; + if(sz>=3) *ptr++ = v.z; + if(sz>=4) *ptr++ = v.w; } } } diff --git a/source/builders/vertexbuilder.h b/source/builders/vertexbuilder.h index 55f914a3..28fb6be2 100644 --- a/source/builders/vertexbuilder.h +++ b/source/builders/vertexbuilder.h @@ -35,13 +35,10 @@ public: protected: Matrix mtx; - Vector3 nor; - Color col; - std::map texc; - std::map attr; + std::vector attr; public: - VertexBuilder(): nor(0, 0, 1) { } + VertexBuilder() { normal(0, 0, 1); } virtual ~VertexBuilder() { } @@ -73,32 +70,30 @@ protected: virtual void vertex_(const Vector4 &) = 0; public: + void attrib(unsigned i, const Vector4 &v) + { + if(i>=attr.size()) + attr.resize(i+1); + attr[i] = v; + } + void normal(float x, float y, float z) { normal(Vector3(x, y, z)); } void normal(const Vector3 &n) - { - Vector4 tn = mtx*Vector4(n.x, n.y, n.z, 0); - nor = Vector3(tn.x, tn.y, tn.z); - } + { attrib(get_component_type(NORMAL3), mtx*Vector4(n.x, n.y, n.z, 0)); } void tangent(float x, float y, float z) { tangent(Vector3(x, y, z)); } void tangent(const Vector3 &t) - { - Vector4 tt = mtx*Vector4(t.x, t.y, t.z, 0); - attrib(get_component_type(TANGENT3), tt); - } + { attrib(get_component_type(TANGENT3), mtx*Vector4(t.x, t.y, t.z, 0)); } void binormal(float x, float y, float z) { binormal(Vector3(x, y, z)); } void binormal(const Vector3 &b) - { - Vector4 tb = mtx*Vector4(b.x, b.y, b.z, 0); - attrib(get_component_type(BINORMAL3), tb); - } + { attrib(get_component_type(BINORMAL3), mtx*Vector4(b.x, b.y, b.z, 0)); } void texcoord(float s) { texcoord(s, 0, 0, 1); } @@ -128,7 +123,7 @@ public: { multitexcoord(i, Vector4(s, t, r, q)); } void multitexcoord(unsigned i, const Vector4 &t) - { texc[i] = t; } + { attrib(get_component_type(TEXCOORD4)+i, t); } void color(unsigned char r, unsigned char g, unsigned char b) { color(r, g, b, 255); } @@ -143,7 +138,7 @@ public: { color(Color(r, g, b, a)); } void color(const Color &c) - { col = c; } + { attrib(get_component_type(COLOR4_FLOAT), Vector4(c.r, c.g, c.b, c.a)); } void attrib(unsigned i, float x) { attrib(i, x, 0, 0, 1); } @@ -156,9 +151,6 @@ public: void attrib(unsigned i, float x, float y, float z, float w) { attrib(i, Vector4(x, y, z, w)); } - - void attrib(unsigned i, const Vector4 &a) - { attr[i] = a; } }; } // namespace GL -- 2.45.2