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