topoRender.h 7.45 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
39
40
41
42

// forward
namespace CGoGN { namespace Utils {  class ShaderSimpleColor; } }
namespace CGoGN { namespace Utils {  class ShaderColorPerVertex; } }

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

namespace Algo
{

namespace Render
{

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

55
class TopoRender
Pierre Kraemer's avatar
Pierre Kraemer committed
56
57
58
59
60
61
62
63
64
{
protected:
	/**
	* vbo buffers
	* 0: vertices darts
	* 1: vertices relation 1
	* 2: vertices relation 2
	* 3: color
	*/
65
66
67
68
69
70
	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
71
72
73
74
75
76

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

77
78
79
80
81
	/**
	* number of relations 1 to draw
	*/
	GLuint m_nbRel1;

Pierre Kraemer's avatar
Pierre Kraemer committed
82
83
84
85
	/**
	* number of relations 2 to draw
	*/
	GLuint m_nbRel2;
86

Pierre Kraemer's avatar
Pierre Kraemer committed
87
88
89
90
91
92
93
94
95
96
	/**
	 * width of lines use to draw darts
	 */
	float m_topo_dart_width;

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

97
98
99
	/// shifting along normals for 3-map boundary drawing
	float m_normalShift;

100
101
	float m_boundShift;

102
103
104
105
106
	/**
	 * initial darts color (set in update)
	 */
	Geom::Vec3f m_dartsColor;

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

Sylvain Thery's avatar
Sylvain Thery committed
112
113
	float *m_color_save;

Pierre Kraemer's avatar
Pierre Kraemer committed
114
115
116
	/**
	 * attribut d'index dans le VBO
	 */
117
	DartAttribute<unsigned int> m_attIndex;
Pierre Kraemer's avatar
Pierre Kraemer committed
118

119
120
	Geom::Vec3f* m_bufferDartPosition;

121
122
123
	Utils::ShaderSimpleColor* m_shader1;
	Utils::ShaderColorPerVertex* m_shader2;

124
125
126
	/**
	 * compute color from dart index (for color picking)
	 */
127
128
	Dart colToDart(float* color);

129
130
131
132
	/**
	 * compute dart  from color (for color picking)
	 */
	void dartToCol(Dart d, float& r, float& g, float& b);
133

134
135
136
	/**
	 * pick the color in the rendered image
	 */
Sylvain Thery's avatar
Sylvain Thery committed
137
138
	Dart pickColor(unsigned int x, unsigned int y);

139
140
141
	/**
	 * affect a color to each dart
	 */
Sylvain Thery's avatar
Sylvain Thery committed
142
	template<typename PFP>
143
	void setDartsIdColor(typename PFP::MAP& map, bool withBoundary);
Sylvain Thery's avatar
Sylvain Thery committed
144

145
146
147
	/**
	 * save colors before picking
	 */
Sylvain Thery's avatar
Sylvain Thery committed
148
149
	void pushColors();

150
151
152
	/**
	 * restore colors after picking
	 */
Sylvain Thery's avatar
Sylvain Thery committed
153
154
	void popColors();

Pierre Kraemer's avatar
Pierre Kraemer committed
155
156
157
158
public:
	/**
	* Constructor
	*/	
159
	TopoRender(float bs = 0.01f);
Pierre Kraemer's avatar
Pierre Kraemer committed
160
161
162
163

	/**
	* Destructor
	*/
164
	~TopoRender();
Pierre Kraemer's avatar
Pierre Kraemer committed
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196

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

	/**
	 * set the with of line use to draw phi (default val is ")
	 * @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();
197

Pierre Kraemer's avatar
Pierre Kraemer committed
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
	/**
	 * 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);

216
217
	void setInitialDartsColor(float r, float g, float b);

218
219
	void setInitialBoundaryDartsColor(float r, float g, float b);

Pierre Kraemer's avatar
Pierre Kraemer committed
220
221
222
223
224
225
226
227
228
	/**
	 * 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);
229
230
231


	/**
Thomas's avatar
Thomas committed
232
	 * pick dart with color set by setDartsIdColor
233
	 * Do not forget to apply same transformation to scene before picking than before drawing !
Sylvain Thery's avatar
Sylvain Thery committed
234
	 * @param map the map in which we pick (same as drawn !)
235
236
237
238
	 * @param x position of mouse (x)
	 * @param y position of mouse (pass H-y, classic pb of origin)
	 * @return the dart or NIL
	 */
Sylvain Thery's avatar
Sylvain Thery committed
239
	template<typename PFP>
240
	Dart picking(typename PFP::MAP& map, int x, int y, bool withBoundary=false);
Pierre Kraemer's avatar
Pierre Kraemer committed
241

242
243

	template<typename PFP>
244
	Dart coneSelection(typename PFP::MAP& map, const Geom::Vec3f& rayA, const Geom::Vec3f& rayAB, float angle);
245
246

	template<typename PFP>
247
	Dart raySelection(typename PFP::MAP& map, const Geom::Vec3f& rayA, const Geom::Vec3f& rayAB, float distmax);
248
249
250



Pierre Kraemer's avatar
Pierre Kraemer committed
251
	template <typename PFP>
252
	void updateData(typename PFP::MAP& map, const VertexAttribute<typename PFP::VEC3>& positions, float ke, float kf, bool withBoundary = false);
Pierre Kraemer's avatar
Pierre Kraemer committed
253
254

	template <typename PFP>
255
	void updateDataMap(typename PFP::MAP& map, const VertexAttribute<typename PFP::VEC3>& positions, float ke, float kf, bool withBoundary = false);
256
257

	template <typename PFP>
258
	void updateDataGMap(typename PFP::MAP& map, const VertexAttribute<typename PFP::VEC3>& positions, float ke, float kf, bool withBoundary = false);
259

260
261
262
263
264
265
266
	/**
	 * Special update function used to draw boundary of map3
	 */
	template<typename PFP>
	void updateDataBoundary(typename PFP::MAP& map, const VertexAttribute<typename PFP::VEC3>& positions, float ke, float kf,float ns);


Sylvain Thery's avatar
Sylvain Thery committed
267
268
269
270
271
272
273
274
	/**
	 * render to svg struct
	 */
	void toSVG(Utils::SVG::SVGOut& svg);

	/**
	 * render svg into svg file
	 */
275
	void svgout2D(const std::string& filename, const glm::mat4& model, const glm::mat4& proj);
276
277
278
279
280
281

	/**
	 * @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);
282
283
284
285
286
287

	/**
	 * @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
288
289
};

290
// just for compatibility with old code
Thery Sylvain's avatar
Thery Sylvain committed
291
292
typedef TopoRender TopoRenderMapD;
typedef TopoRender TopoRenderGMap;
293
294

} // namespace GL2
Pierre Kraemer's avatar
Pierre Kraemer committed
295
296
297
298
299
300
301
302

} // namespace Render

} // namespace Algo

} // namespace CGoGN


Sylvain Thery's avatar
Sylvain Thery committed
303
#include "Algo/Render/GL2/topoRender.hpp"
Pierre Kraemer's avatar
Pierre Kraemer committed
304
305

#endif