topoRender.h 7.86 KB
Newer Older
Pierre Kraemer's avatar
Pierre Kraemer committed
1
2
3
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
4
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
Pierre Kraemer's avatar
Pierre Kraemer committed
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
*                                                                              *
* This library is free software; you can redistribute it and/or modify it      *
* under the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation; either version 2.1 of the License, or (at your     *
* option) any later version.                                                   *
*                                                                              *
* This library is distributed in the hope that it will be useful, but WITHOUT  *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License  *
* for more details.                                                            *
*                                                                              *
* You should have received a copy of the GNU Lesser General Public License     *
* along with this library; if not, write to the Free Software Foundation,      *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.           *
*                                                                              *
20
* Web site: http://cgogn.unistra.fr/                                           *
Pierre Kraemer's avatar
Pierre Kraemer committed
21
22
23
24
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

25
26
#ifndef _GL2_TOPO_RENDER_
#define _GL2_TOPO_RENDER_
Pierre Kraemer's avatar
Pierre Kraemer committed
27
28
29
30
31
32
33

#include <vector>
#include <list>

#include "Topology/generic/dart.h"
#include "Topology/generic/attributeHandler.h"
#include "Topology/generic/functor.h"
34
#include "Geometry/vector_gen.h"
Pierre Kraemer's avatar
Pierre Kraemer committed
35

Thery Sylvain's avatar
Thery Sylvain committed
36
#include "Utils/vbo_base.h"
37
#include "Utils/svg.h"
38

untereiner's avatar
untereiner committed
39
40
41
#include "Utils/Shaders/shaderSimpleColor.h"
#include "Utils/Shaders/shaderColorPerVertex.h"

Pierre Kraemer's avatar
Pierre Kraemer committed
42
43
44
45
46
47
48
49
50
namespace CGoGN
{

namespace Algo
{

namespace Render
{

Sylvain Thery's avatar
Sylvain Thery committed
51
namespace GL2
Pierre Kraemer's avatar
Pierre Kraemer committed
52
53
{

Pierre Kraemer's avatar
Pierre Kraemer committed
54
template <typename PFP>
55
class TopoRender
Pierre Kraemer's avatar
Pierre Kraemer committed
56
{
57
58
	typedef typename PFP::MAP MAP;
	typedef typename PFP::VEC3 VEC3;
Pierre Kraemer's avatar
Pierre Kraemer committed
59
	typedef typename PFP::REAL REAL;
60

Pierre Kraemer's avatar
Pierre Kraemer committed
61
62
63
64
65
66
67
68
protected:
	/**
	* vbo buffers
	* 0: vertices darts
	* 1: vertices relation 1
	* 2: vertices relation 2
	* 3: color
	*/
69
70
71
72
73
74
	Utils::VBO* m_vbo0;
	Utils::VBO* m_vbo1;
	Utils::VBO* m_vbo2;
	Utils::VBO* m_vbo3;

	unsigned int m_vaId;
Pierre Kraemer's avatar
Pierre Kraemer committed
75
76
77
78
79
80

	/**
	*number of darts to draw
	*/
	GLuint m_nbDarts;

81
82
83
84
85
	/**
	* number of relations 1 to draw
	*/
	GLuint m_nbRel1;

Pierre Kraemer's avatar
Pierre Kraemer committed
86
87
88
89
	/**
	* number of relations 2 to draw
	*/
	GLuint m_nbRel2;
90

Pierre Kraemer's avatar
Pierre Kraemer committed
91
92
93
94
95
96
97
98
99
100
	/**
	 * width of lines use to draw darts
	 */
	float m_topo_dart_width;

	/**
	 * width of lines use to draw phi
	 */
	float m_topo_relation_width;

101
102
103
	/// shifting along normals for 3-map boundary drawing
	float m_normalShift;

104
105
	float m_boundShift;

106
107
108
109
110
	/**
	 * initial darts color (set in update)
	 */
	Geom::Vec3f m_dartsColor;

111
112
113
114
115
	/**
	 * initial darts color (set in update)
	 */
	Geom::Vec3f m_dartsBoundaryColor;

Sylvain Thery's avatar
Sylvain Thery committed
116
117
	float *m_color_save;

Pierre Kraemer's avatar
Pierre Kraemer committed
118
119
120
	/**
	 * attribut d'index dans le VBO
	 */
121
	DartAttribute<unsigned int, MAP> m_attIndex;
Pierre Kraemer's avatar
Pierre Kraemer committed
122

123
124
	Geom::Vec3f* m_bufferDartPosition;

125
126
127
	Utils::ShaderSimpleColor* m_shader1;
	Utils::ShaderColorPerVertex* m_shader2;

128
129
130
	/**
	 * compute color from dart index (for color picking)
	 */
131
132
	Dart colToDart(float* color);

133
134
135
136
	/**
	 * compute dart  from color (for color picking)
	 */
	void dartToCol(Dart d, float& r, float& g, float& b);
137

138
139
140
	/**
	 * pick the color in the rendered image
	 */
Sylvain Thery's avatar
Sylvain Thery committed
141
142
	Dart pickColor(unsigned int x, unsigned int y);

143
144
145
	/**
	 * affect a color to each dart
	 */
146
	void setDartsIdColor(MAP& map, bool withBoundary);
Sylvain Thery's avatar
Sylvain Thery committed
147

148
149
150
	/**
	 * save colors before picking
	 */
Sylvain Thery's avatar
Sylvain Thery committed
151
152
	void pushColors();

153
154
155
	/**
	 * restore colors after picking
	 */
Sylvain Thery's avatar
Sylvain Thery committed
156
157
	void popColors();

Pierre Kraemer's avatar
Pierre Kraemer committed
158
159
160
public:
	/**
	* Constructor
161
	* @param bs shift for boundary drawing
Pierre Kraemer's avatar
Pierre Kraemer committed
162
	*/
163
	TopoRender(float bs = 0.01f);
Pierre Kraemer's avatar
Pierre Kraemer committed
164
165
166
167

	/**
	* Destructor
	*/
168
	~TopoRender();
Pierre Kraemer's avatar
Pierre Kraemer committed
169
170
171
172
173
174
175
176

	/**
	 * set the with of line use to draw darts (default val is 2)
	 * @param dw width
	 */
	void setDartWidth(float dw);

	/**
Pierre Kraemer's avatar
Pierre Kraemer committed
177
	 * set the with of line use to draw phi (default val is 3)
Pierre Kraemer's avatar
Pierre Kraemer committed
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
	 * @param pw width
	 */
	void setRelationWidth(float pw);

	/**
	* Drawing function for darts only
	*/
	void drawDarts();

	/**
	* Drawing function for phi1 only
	*/
	void drawRelation1();

	/**
	* Drawing function for phi2 only
	*/
	void drawRelation2();

	/**
	 * draw all topo
	 */
	void drawTopo();
201

202
203
204
205
206
207
	/**
	 * get shader objects
	 */
	Utils::GLSLShader* shader1() { return static_cast<Utils::GLSLShader*>(m_shader1); }
	Utils::GLSLShader* shader2() { return static_cast<Utils::GLSLShader*>(m_shader2); }

Pierre Kraemer's avatar
Pierre Kraemer committed
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
	/**
	 * change dart drawing color
	 * @param d the dart
	 * @param r red !
	 * @param g green !
	 * @param b blue !
	 */
	void setDartColor(Dart d, float r, float g, float b);

	/**
	 * change all darts drawing color
	 * @param d the dart
	 * @param r red !
	 * @param g green !
	 * @param b blue !
	 */
	void setAllDartsColor(float r, float g, float b);

226
227
	void setInitialDartsColor(float r, float g, float b);

228
229
	void setInitialBoundaryDartsColor(float r, float g, float b);

Pierre Kraemer's avatar
Pierre Kraemer committed
230
231
232
233
234
235
236
237
238
	/**
	 * redraw one dart with specific width and color (not efficient use only for debug with small amount of call)
	 * @param d the dart
	 * @param width the drawing width
	 * @param r red !
	 * @param g green !
	 * @param b blue !
	 */
	void overdrawDart(Dart d, float width, float r, float g, float b);
239
240

	/**
Thomas's avatar
Thomas committed
241
	 * pick dart with color set by setDartsIdColor
242
	 * Do not forget to apply same transformation to scene before picking than before drawing !
Sylvain Thery's avatar
Sylvain Thery committed
243
	 * @param map the map in which we pick (same as drawn !)
244
245
246
247
	 * @param x position of mouse (x)
	 * @param y position of mouse (pass H-y, classic pb of origin)
	 * @return the dart or NIL
	 */
248
	Dart picking(MAP& map, int x, int y, bool withBoundary=false);
Pierre Kraemer's avatar
Pierre Kraemer committed
249

250
	Dart coneSelection(MAP& map, const Geom::Vec3f& rayA, const Geom::Vec3f& rayAB, float angle);
251

252
	Dart raySelection(MAP& map, const Geom::Vec3f& rayA, const Geom::Vec3f& rayAB, float distmax);
253

254
	virtual void updateData(MAP& map, const VertexAttribute<VEC3, MAP>& positions, float ke, float kf, bool withBoundary = false, bool onlyBoundary=false) = 0;
255

256
257
258
	/**
	 * Special update function used to draw boundary of map3
	 */
259
	void updateDataBoundary(MAP& map, const VertexAttribute<VEC3, MAP>& positions, float ke, float kf, float ns);
260

Sylvain Thery's avatar
Sylvain Thery committed
261
262
263
264
265
266
267
268
	/**
	 * render to svg struct
	 */
	void toSVG(Utils::SVG::SVGOut& svg);

	/**
	 * render svg into svg file
	 */
269
	void svgout2D(const std::string& filename, const glm::mat4& model, const glm::mat4& proj);
270
271
272
273
274
275

	/**
	 * @brief set normal shift for boundary of dim 3 drawing
	 * @param ns distance shift along normals (use BB.diagSize()/100 is good approximation)
	 */
	void setNormalShift(float ns);
276
277
278
279
280
281

	/**
	 * @brief set boundary shift for boundary of dim 2 drawing
	 * @param ns distance shift
	 */
	void setBoundaryShift(float bs);
Pierre Kraemer's avatar
Pierre Kraemer committed
282
283
};

Pierre Kraemer's avatar
Pierre Kraemer committed
284
285
286
287
288
289
290
291
292
template <typename PFP>
class TopoRenderMap : public TopoRender<PFP>
{
	typedef typename PFP::MAP MAP;
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;

public:
	TopoRenderMap(float bs = 0.01f) : TopoRender<PFP>(bs) {}
293
	void updateData(MAP &map, const VertexAttribute<VEC3, MAP>& positions, float ke, float kf, bool withBoundary = false, bool onlyBoundary=false);
Pierre Kraemer's avatar
Pierre Kraemer committed
294
295
296
297
298
299
300
301
302
303
304
};

template <typename PFP>
class TopoRenderGMap : public TopoRender<PFP>
{
	typedef typename PFP::MAP MAP;
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;

public:
	TopoRenderGMap(float bs = 0.01f) : TopoRender<PFP>(bs) {}
305
	void updateData(MAP &map, const VertexAttribute<VEC3, MAP>& positions, float ke, float kf, bool withBoundary = false, bool onlyBoundary=false);
Pierre Kraemer's avatar
Pierre Kraemer committed
306
307
};

308
} // namespace GL2
Pierre Kraemer's avatar
Pierre Kraemer committed
309
310
311
312
313
314
315

} // namespace Render

} // namespace Algo

} // namespace CGoGN

Sylvain Thery's avatar
Sylvain Thery committed
316
#include "Algo/Render/GL2/topoRender.hpp"
Pierre Kraemer's avatar
Pierre Kraemer committed
317
318

#endif