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