topo3Render.h 7.94 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-2011, 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.u-strasbg.fr/                                         *
Pierre Kraemer's avatar
Pierre Kraemer committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#ifndef _TOPO3_VBO_RENDER
#define _TOPO3_VBO_RENDER

#include <GL/glew.h>

#include <vector>
#include <list>

#include "Topology/generic/dart.h"
#include "Topology/generic/attributeHandler.h"
#include "Topology/generic/functor.h"

37
38
39
40
41
42
#include "Utils/vbo.h"

// 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
{


56
class Topo3Render
Pierre Kraemer's avatar
Pierre Kraemer committed
57
58
59
60
61
62
{
protected:

	/**
	* vbo buffers
	* 0: vertices darts
63
64
65
	* 1: vertices phi1 / beta1
	* 2: vertices phi2 / beta2
	* 3: vertices phi3 / beta3
Sylvain Thery's avatar
Sylvain Thery committed
66
	* 4: colors
Pierre Kraemer's avatar
Pierre Kraemer committed
67
	*/
68
69
70
71
72
73
74
75
76
77
78
	Utils::VBO* m_vbo0;
	Utils::VBO* m_vbo1;
	Utils::VBO* m_vbo2;
	Utils::VBO* m_vbo3;
	Utils::VBO* m_vbo4;

	unsigned int m_vaId;

	Utils::ShaderSimpleColor* m_shader1;
	Utils::ShaderColorPerVertex* m_shader2;

Pierre Kraemer's avatar
Pierre Kraemer committed
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
	/**
	*number of darts to draw
	*/
	GLuint m_nbDarts;

	/**
	* number of relations 2 to draw
	*/
	GLuint m_nbRel2;

	/**
	* number of relations 3 to draw
	*/
	GLuint m_nbRel3;

	/**
	 * width of lines use to draw darts
	 */
	float m_topo_dart_width;

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

104
105
106

	float *m_color_save;

Pierre Kraemer's avatar
Pierre Kraemer committed
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
	AttributeHandler<unsigned int> m_attIndex;

	/**
	* update all drawing buffers
	* @param map the map
	* @param good selector
	* @param positions  attribute of position vertices
	* @param ke exploding coef for edge
	* @param kf exploding coef for face
 	* @param kv exploding coef for volume
	*/
	template<typename PFP>
	void updateMapD3(typename PFP::MAP& map, const FunctorSelect& good, const typename PFP::TVEC3& positions, float ke, float kf, float kv);


	/**
	* update all drawing buffers
	* @param map the map
	* @param good selector
	* @param positions  attribute of position vertices
	* @param ke exploding coef for edge
	* @param kf exploding coef for face
 	* @param kv exploding coef for volume
	*/
	template<typename PFP>
	void updateGMap3(typename PFP::MAP& map, const FunctorSelect& good, const typename PFP::TVEC3& positions, float ke, float kf, float kv);


Sylvain Thery's avatar
Sylvain Thery committed
135
136
137
138
139
140
141
142
143
144
145
146
	/**
	 * save colors
	 */
	void pushColors();


	/**
	 * restore colors
	 */
	void popColors();

	/**
Thomas's avatar
Thomas committed
147
	 * pick dart with color set by setDartsIdColor
Sylvain Thery's avatar
Sylvain Thery committed
148
149
150
151
152
	 * @param x position of mouse (x)
	 * @param y position of mouse (pass H-y, classic pb of origin)
	 * @return the dart or NIL
	 */
	Dart pickColor(unsigned int x, unsigned int y);
Pierre Kraemer's avatar
Pierre Kraemer committed
153
154

public:
Sylvain Thery's avatar
Sylvain Thery committed
155
156
157
158
159

	Dart colToDart(float* color);

	void dartToCol(Dart d, float& r, float& g, float& b);

Pierre Kraemer's avatar
Pierre Kraemer committed
160
161
162
163
164
165
	/**
	* Constructor
	* @param map the map to draw
	* @param good functor that return true for darts of part to draw
	* @param type_vbo vbo to alloc ( VBO_P, VBO_PN, VBO_PNC, VBO_PC ..)
	*/
166
	Topo3Render();
Pierre Kraemer's avatar
Pierre Kraemer committed
167
168
169
170

	/**
	* Destructor
	*/
171
	~Topo3Render();
Pierre Kraemer's avatar
Pierre Kraemer committed
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240

	/**
	 * 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();

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

	/**
	 * draw all topo
	 * \warning DO NOT FORGET TO DISABLE CULLFACE BEFORE CALLING
	 */
	void drawTopo();

//	void drawDart(Dart d, float R, float G, float B, float width);

	/**
	 * 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);

	/**
	 * overdraw a dart with given width and color
	 * @param d the dart
	 * @param width drawing width
	 * @param r red !
	 * @param g green !
	 * @param b blue !
	 */
	void overdrawDart(Dart d, float width, float r, float g, float b);

241
242
243
244
245
246
247
248
249
250
251
	/*
	 * store darts in color for picking
	 * @param map the map (must be the same than during updating data)
	 * @param good the selector (must be the same than during updating data)
	 */
	template<typename PFP>
	void setDartsIdColor(typename PFP::MAP& map, const FunctorSelect& good);

	/**
	 * pick dart with color set bey setDartsIdColor
	 * Do not forget to apply same transformation to scene before picking than before drawing !
Sylvain Thery's avatar
Sylvain Thery committed
252
253
	 * @param map the map
	 * @param good a dart selector
254
255
256
257
	 * @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
258
259
260
	template<typename PFP>
	Dart picking(typename PFP::MAP& map, const FunctorSelect& good, int x, int y);

Pierre Kraemer's avatar
Pierre Kraemer committed
261
	/**
Thomas's avatar
Thomas committed
262
	* update all drawing buffers to render a dual map
Pierre Kraemer's avatar
Pierre Kraemer committed
263
264
265
266
267
268
269
270
	* @param map the map
	* @param good selector
	* @param positions  attribute of position vertices
	* @param ke exploding coef for edge
	* @param kf exploding coef for face
 	* @param kv exploding coef for face
	*/
	template<typename PFP>
271
	void updateData(typename PFP::MAP& map, const typename PFP::TVEC3& positions, float ke, float kf, float kv, const FunctorSelect& good = allDarts);
Thomas's avatar
Thomas committed
272

273
274
275
276
277
278
279
280
281
282
283
284
protected:
	/**
	* update all drawing buffers to render a dual map
	* @param map the map
	* @param positions  attribute of position vertices
	* @param ke exploding coef for edge
	* @param kf exploding coef for face
 	* @param kv exploding coef for face
	* @param good selector
	*/
	template<typename PFP>
	void updateDataMap3(typename PFP::MAP& map, const typename PFP::TVEC3& positions, float ke, float kf, float kv, const FunctorSelect& good = allDarts);
Thomas's avatar
Thomas committed
285
286

	/**
Thomas's avatar
Thomas committed
287
	* update all drawing buffers to render a gmap
Thomas's avatar
Thomas committed
288
289
290
291
292
	* @param map the map
	* @param positions  attribute of position vertices
	* @param ke exploding coef for edge
	* @param kf exploding coef for face
 	* @param kv exploding coef for face
293
	* @param good selector
Thomas's avatar
Thomas committed
294
295
	*/
	template<typename PFP>
296
297
	void updateDataGMap3(typename PFP::MAP& map, const typename PFP::TVEC3& positions, float ke, float kf, float kv, const FunctorSelect& good = allDarts);

Thomas's avatar
Thomas committed
298
};
Pierre Kraemer's avatar
Pierre Kraemer committed
299

300
301

}//end namespace GL2
Pierre Kraemer's avatar
Pierre Kraemer committed
302
303
304
305
306
307
308

}//end namespace Algo

}//end namespace Render

}//end namespace CGoGN

Sylvain Thery's avatar
Sylvain Thery committed
309
#include "Algo/Render/GL2/topo3Render.hpp"
Pierre Kraemer's avatar
Pierre Kraemer committed
310
311

#endif