1 /* 2 Copyright (C) 2010-2014 Kristian Duske 3 4 This file is part of TrenchBroom. 5 6 TrenchBroom is free software: you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 TrenchBroom is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with TrenchBroom. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #ifndef IndexRangeBuilder_h 21 #define IndexRangeBuilder_h 22 23 #include "Renderer/IndexRangeMap.h" 24 #include "Renderer/VertexListBuilder.h" 25 26 namespace TrenchBroom { 27 namespace Renderer { 28 template <typename VertexSpec> 29 class IndexRangeMapBuilder { 30 public: 31 typedef typename VertexSpec::Vertex Vertex; 32 typedef typename Vertex::List VertexList; 33 typedef typename VertexListBuilder<VertexSpec>::IndexData IndexData; 34 private: 35 VertexListBuilder<VertexSpec> m_vertexListBuilder; 36 IndexRangeMap m_indexRange; 37 public: IndexRangeMapBuilder()38 IndexRangeMapBuilder() {} // default constructors allow dynamic growth 39 IndexRangeMapBuilder(const size_t vertexCount,const IndexRangeMap::Size & indexRangeSize)40 IndexRangeMapBuilder(const size_t vertexCount, const IndexRangeMap::Size& indexRangeSize) : 41 m_vertexListBuilder(vertexCount), 42 m_indexRange(indexRangeSize) {} 43 vertices()44 const VertexList& vertices() const { 45 return m_vertexListBuilder.vertices(); 46 } 47 vertices()48 VertexList& vertices() { 49 return m_vertexListBuilder.vertices(); 50 } 51 indexArray()52 const IndexRangeMap& indexArray() const { 53 return m_indexRange; 54 } 55 indexArray()56 IndexRangeMap& indexArray() { 57 return m_indexRange; 58 } 59 addPoint(const Vertex & v)60 void addPoint(const Vertex& v) { 61 add(GL_POINTS, m_vertexListBuilder.addPoint(v)); 62 } 63 addPoints(const VertexList & vertices)64 void addPoints(const VertexList& vertices) { 65 add(GL_POINTS, m_vertexListBuilder.addPoints(vertices)); 66 } 67 addLine(const Vertex & v1,const Vertex & v2)68 void addLine(const Vertex& v1, const Vertex& v2) { 69 add(GL_LINES, m_vertexListBuilder.addLine(v1, v2)); 70 } 71 addLines(const VertexList & vertices)72 void addLines(const VertexList& vertices) { 73 add(GL_LINES, m_vertexListBuilder.addLines(vertices)); 74 } 75 addLineStrip(const VertexList & vertices)76 void addLineStrip(const VertexList& vertices) { 77 add(GL_LINE_STRIP, m_vertexListBuilder.addLineStrip(vertices)); 78 } 79 addLineLoop(const VertexList & vertices)80 void addLineLoop(const VertexList& vertices) { 81 add(GL_LINE_LOOP, m_vertexListBuilder.addLineLoop(vertices)); 82 } 83 addTriangle(const Vertex & v1,const Vertex & v2,const Vertex & v3)84 void addTriangle(const Vertex& v1, const Vertex& v2, const Vertex& v3) { 85 add(GL_TRIANGLES, m_vertexListBuilder.addTriangle(v1, v2, v3)); 86 } 87 addTriangles(const VertexList & vertices)88 void addTriangles(const VertexList& vertices) { 89 add(GL_TRIANGLES, m_vertexListBuilder.addTriangles(vertices)); 90 } 91 addTriangleFan(const VertexList & vertices)92 void addTriangleFan(const VertexList& vertices) { 93 add(GL_TRIANGLE_FAN, m_vertexListBuilder.addTriangleFan(vertices)); 94 } 95 addTriangleStrip(const VertexList & vertices)96 void addTriangleStrip(const VertexList& vertices) { 97 add(GL_TRIANGLE_STRIP, m_vertexListBuilder.addTriangleStrip(vertices)); 98 } 99 addQuad(const Vertex & v1,const Vertex & v2,const Vertex & v3,const Vertex & v4)100 void addQuad(const Vertex& v1, const Vertex& v2, const Vertex& v3, const Vertex& v4) { 101 add(GL_QUADS, m_vertexListBuilder.addQuad(v1, v2, v3, v4)); 102 } 103 addQuads(const VertexList & vertices)104 void addQuads(const VertexList& vertices) { 105 add(GL_QUADS, m_vertexListBuilder.addQuads(vertices)); 106 } 107 addQuadStrip(const VertexList & vertices)108 void addQuadStrip(const VertexList& vertices) { 109 add(GL_QUAD_STRIP, m_vertexListBuilder.addQuadStrip(vertices)); 110 } 111 addPolygon(const VertexList & vertices)112 void addPolygon(const VertexList& vertices) { 113 add(GL_POLYGON, m_vertexListBuilder.addPolygon(vertices)); 114 } 115 private: add(const PrimType primType,const IndexData & data)116 void add(const PrimType primType, const IndexData& data) { 117 m_indexRange.add(primType, data.index, data.count); 118 } 119 }; 120 } 121 } 122 123 #endif /* IndexRangeBuilder_h */ 124