tuto5.cpp 9.75 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
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

25
26
#define WITH_GMAP 1

Pierre Kraemer's avatar
Pierre Kraemer committed
27

28
#include "tuto5.h"
Sylvain Thery's avatar
Sylvain Thery committed
29
30
31
#include <iostream>

#include "Topology/generic/parameters.h"
32
33
34
35
36
#ifdef WITH_GMAP
	#include "Topology/gmap/embeddedGMap3.h"
#else
	#include "Topology/map/embeddedMap3.h"
#endif
Sylvain Thery's avatar
Sylvain Thery committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

#include "Geometry/vector_gen.h"
#include "Algo/Geometry/boundingbox.h"
#include "Algo/Render/GL2/mapRender.h"
#include "Utils/Shaders/shaderSimpleColor.h"

#include "Algo/Modelisation/primitives3d.h"
#include "Algo/Modelisation/polyhedron.h"
#include "Algo/Modelisation/subdivision.h"

#include "Algo/Render/GL2/topo3Render.h"

#include "Topology/generic/cellmarker.h"
#include "Utils/text3d.h"

#include "Utils/pointSprite.h"
#include "Utils/Shaders/shaderVectorPerVertex.h"
#include "Utils/cgognStream.h"

#include "Algo/Render/SVG/mapSVGRender.h"

using namespace CGoGN ;

struct PFP: public PFP_STANDARD
61
{
Sylvain Thery's avatar
Sylvain Thery committed
62
	// definition de la carte
63
64
65
#ifdef WITH_GMAP
	typedef EmbeddedGMap3 MAP;
#else
Sylvain Thery's avatar
Sylvain Thery committed
66
	typedef EmbeddedMap3 MAP;
67
#endif
Sylvain Thery's avatar
Sylvain Thery committed
68
69
70
71
72
73
74
75
76
};

PFP::MAP myMap;
PFP::TVEC3 position ;
Dart dglobal;

void MyQT::balls_onoff(bool x)
{
	render_balls = !render_balls;
77
	updateGL();
Sylvain Thery's avatar
Sylvain Thery committed
78
	CGoGNerr << " balls_onoff  "<< CGoGNendl;
79
}
80

Sylvain Thery's avatar
Sylvain Thery committed
81
void MyQT::vectors_onoff(bool x)
82
{
Sylvain Thery's avatar
Sylvain Thery committed
83
84
85
	render_vectors = !render_vectors;
	updateGL();
	CGoGNerr << " vectors_onoff  "<< CGoGNflush;
86
87
}

Sylvain Thery's avatar
Sylvain Thery committed
88
void MyQT::text_onoff(bool x)
Pierre Kraemer's avatar
Pierre Kraemer committed
89
{
Sylvain Thery's avatar
Sylvain Thery committed
90
91
92
	render_text = !render_text;
	updateGL();
	CGoGNerr << " text_onoff  " << CGoGNflush;
93
}
Pierre Kraemer's avatar
Pierre Kraemer committed
94
95


Sylvain Thery's avatar
Sylvain Thery committed
96
97
98
99
100
void MyQT::topo_onoff(bool x)
{
	render_topo = !render_topo;
	updateGL();
	CGoGNerr << " topo_onoff  " << CGoGNflush;
Pierre Kraemer's avatar
Pierre Kraemer committed
101
102
}

Sylvain Thery's avatar
Sylvain Thery committed
103
void MyQT::slider_balls(int x)
Sylvain Thery's avatar
Sylvain Thery committed
104
{
Sylvain Thery's avatar
Sylvain Thery committed
105
106
	m_sprite->setSize(0.05f*x);
	updateGL();
Sylvain Thery's avatar
Sylvain Thery committed
107
108
}

Sylvain Thery's avatar
Sylvain Thery committed
109
void MyQT::slider_vectors(int x)
110
{
Sylvain Thery's avatar
Sylvain Thery committed
111
112
	m_lines->setScale(0.02*x);
	updateGL();
113
114
}

Sylvain Thery's avatar
Sylvain Thery committed
115
void MyQT::slider_text(int x)
116
{
Sylvain Thery's avatar
Sylvain Thery committed
117
118
	m_strings->setScale(0.02f*x);
	updateGL();
119
}
120

Sylvain Thery's avatar
Sylvain Thery committed
121
122
123


void MyQT::animate()
124
{
Sylvain Thery's avatar
Sylvain Thery committed
125
126
127
//	transfoMatrix() = glm::rotate(transfoMatrix(), 0.5f, glm::vec3(0.5773f,0.5773f,0.5773f));
	transfoRotate( 0.5f, 0.5773f,0.5773f,0.5773f);
	updateGLMatrices();
untereiner's avatar
untereiner committed
128
129
130
}


Sylvain Thery's avatar
Sylvain Thery committed
131
void MyQT::storeVerticesInfo()
untereiner's avatar
untereiner committed
132
{
133

Sylvain Thery's avatar
Sylvain Thery committed
134
135
136
137
138
139
140
141
142
143
144
	CellMarker mv(myMap,VERTEX);
	for (Dart d=myMap.begin(); d!=myMap.end(); myMap.next(d))
	{
		if (!mv.isMarked(d))
		{
			mv.mark(d);
			std::stringstream ss;
			ss << d << " : "<< position[d];
			m_strings->addString(ss.str(),position[d]);
		}
	}
145
}
146

Sylvain Thery's avatar
Sylvain Thery committed
147
void MyQT::cb_initGL()
Pierre Kraemer's avatar
Pierre Kraemer committed
148
{
Sylvain Thery's avatar
Sylvain Thery committed
149
150
151
152
153
154
	// choose to use GL version 2
	Utils::GLSLShader::setCurrentOGLVersion(2);

	// create the render
	m_render = new Algo::Render::GL2::MapRender();

155
    m_render_topo = new Algo::Render::GL2::Topo3Render();
Sylvain Thery's avatar
Sylvain Thery committed
156
157
158
159
160
161
162
163
164
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

 	// create VBO for position
	m_positionVBO = new Utils::VBO();
	m_positionVBO->updateData(position);

	// using simple shader with color
	m_shader = new Utils::ShaderSimpleColor();
	m_shader->setAttributePosition(m_positionVBO);
	m_shader->setColor(Geom::Vec4f(0.,1.,0.,0.));

	m_sprite = new Utils::PointSprite();
	m_sprite->setAttributePosition(m_positionVBO);

    m_strings = new Utils::Strings3D(true, Geom::Vec3f(0.1f,0.0f,0.3f));
    storeVerticesInfo();
    m_strings->sendToVBO();

    // copy de contenu de VBO a la creation
	m_dataVBO = new Utils::VBO(*m_positionVBO);

	m_lines = new Utils::ShaderVectorPerVertex();
	m_lines->setAttributePosition(m_positionVBO);
	m_lines->setAttributeVector(m_dataVBO);
	m_lines->setScale(0.2f);
	m_lines->setColor(Geom::Vec4f(0.0f, 1.0f, 0.2f, 0.0f));

	// accede au buffer du VBO pour modification
	PFP::VEC3* data = static_cast<PFP::VEC3*>(m_dataVBO->lockPtr());
	for (unsigned int i=0; i< m_dataVBO->nbElts(); ++i)
	{
		data[i].normalize();
	}
	m_dataVBO->releasePtr();

	registerShader(m_shader);
	registerShader(m_strings);
	registerShader(m_sprite);
	registerShader(m_lines);
194

Sylvain Thery's avatar
Sylvain Thery committed
195
	SelectorTrue allDarts;
196

Sylvain Thery's avatar
Sylvain Thery committed
197
198
199
	m_render->initPrimitives<PFP>(myMap, allDarts, Algo::Render::GL2::TRIANGLES);
	m_render->initPrimitives<PFP>(myMap, allDarts, Algo::Render::GL2::LINES);
	m_render->initPrimitives<PFP>(myMap, allDarts, Algo::Render::GL2::POINTS);
200

Sylvain Thery's avatar
Sylvain Thery committed
201
	SelectorDartNoBoundary<PFP::MAP> nb(myMap);
202
	m_render_topo->updateData<PFP>(myMap, position,  0.9f, 0.9f, 0.9f, nb);
203
204


Sylvain Thery's avatar
Sylvain Thery committed
205
206
207
208
	// timer example for animation
	m_timer = new QTimer( this );
	connect( m_timer, SIGNAL(timeout()), SLOT(animate()) );
}
209

Sylvain Thery's avatar
Sylvain Thery committed
210
211
212
213
void MyQT::cb_redraw()
{
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glEnable(GL_LIGHTING);
214

Sylvain Thery's avatar
Sylvain Thery committed
215
	m_render->draw(m_shader, Algo::Render::GL2::POINTS);
216

Sylvain Thery's avatar
Sylvain Thery committed
217
218
219
	glLineWidth(2.0f);
	m_shader->setColor(Geom::Vec4f(1.,1.,0.,0.));
	m_render->draw(m_shader, Algo::Render::GL2::LINES);
220

Sylvain Thery's avatar
Sylvain Thery committed
221
222
	glEnable(GL_POLYGON_OFFSET_FILL);
	glPolygonOffset(1.0f, 1.0f);
223

Sylvain Thery's avatar
Sylvain Thery committed
224
225
	if (render_topo)
		m_render_topo->drawTopo();
226

Sylvain Thery's avatar
Sylvain Thery committed
227
228
229
230
	Dart d = myMap.phi2(myMap.begin());
	m_render_topo->overdrawDart(d, 5, 1.0f, 0.0f, 1.0f);
	 d = myMap.phi1(myMap.begin());
	m_render_topo->overdrawDart(d, 5, 1.0f, 0.0f, 1.0f);
231

Sylvain Thery's avatar
Sylvain Thery committed
232
	glDisable(GL_POLYGON_OFFSET_FILL);
233

Sylvain Thery's avatar
Sylvain Thery committed
234
235
	if (render_text)
		m_strings->drawAll(Geom::Vec3f(0.0f, 1.0f, 1.0f));
236

Sylvain Thery's avatar
Sylvain Thery committed
237
238
239
240
241
242
	if (render_balls)
	{
		m_sprite->predraw(Geom::Vec3f(1.0f, 0.0f ,0.0f));
		m_render->draw(m_sprite, Algo::Render::GL2::POINTS);
		m_sprite->postdraw();
	}
243

Sylvain Thery's avatar
Sylvain Thery committed
244
245
246
247
248
249
	if (render_vectors)
	{
		glLineWidth(1.0f);
		m_render->draw(m_lines, Algo::Render::GL2::POINTS);
	}
}
250

Sylvain Thery's avatar
Sylvain Thery committed
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
void MyQT::cb_mousePress(int button, int x, int y)
{
	if (Shift())
	{
		Dart d = m_render_topo->picking<PFP>(myMap, allDarts, x,y);
		if (d != Dart::nil())
		{
			CGoGNout << "Dart "<< d << " clicked" << CGoGNendl;
		}
		else
		{
			statusMsg("");
		}
	}
}
266

Sylvain Thery's avatar
Sylvain Thery committed
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
void MyQT::cb_keyPress(int code)
{
	if (code  == 's')
	{
		std::string filename = selectFileSave("Export SVG file ");
		CGoGNout << "Exporting "<<filename<<CGoGNendl;
		Algo::Render::SVG::SVGOut svg(filename,modelViewMatrix(),projectionMatrix());
//		svg.renderLinesToSVG<PFP>(myMap,position);
		svg.setColor(Geom::Vec3f(1.,0.,0.));
		svg.renderFacesToSVG<PFP>(myMap,position,0.8f);
		//svg destruction close the file
	}
	if (code  == 't')
	{
		if (m_timer->isActive())
			m_timer->stop();
		else
			m_timer->start(1000/30); // 30 fps
	}
}
Sylvain Thery's avatar
bug    
Sylvain Thery committed
287

Sylvain Thery's avatar
Sylvain Thery committed
288

Sylvain Thery's avatar
bug    
Sylvain Thery committed
289

Sylvain Thery's avatar
Sylvain Thery committed
290
291
292
int main(int argc, char **argv)
{
	position = myMap.addAttribute<PFP::VEC3>(VERTEX, "position");
untereiner's avatar
untereiner committed
293

Sylvain Thery's avatar
Sylvain Thery committed
294
295
	CGoGNout << 5.34 << " toto "<< Geom::Vec3f(2.5f, 2.2f, 4.3f) << CGoGNendl;
	CGoGNout << 3 << " tutu "<< 4 <<CGoGNendl;
untereiner's avatar
untereiner committed
296
297


Sylvain Thery's avatar
Sylvain Thery committed
298
299
300
301
302
303
	Algo::Modelisation::Primitive3D<PFP> prim(myMap, position);
	int nb=3;
	if (argc>1)
		nb = atoi(argv[1]);
	dglobal = prim.hexaGrid_topo(nb,nb,nb);
	prim.embedHexaGrid(1.0f,1.0f,1.0f);
untereiner's avatar
untereiner committed
304

Sylvain Thery's avatar
Sylvain Thery committed
305
306
307
    // un peu d'interface
	QApplication app(argc, argv);
	MyQT sqt;
Pierre Kraemer's avatar
Pierre Kraemer committed
308

309
310
311
	// interface de tuto5.ui
    Utils::QT::uiDockInterface dock;
    sqt.setDock(&dock);
Pierre Kraemer's avatar
Pierre Kraemer committed
312

Sylvain Thery's avatar
Sylvain Thery committed
313
314
315
316
317
318
319
320
321
322
323
324
 	// message d'aide
	sqt.setHelpMsg("Enter pour dock on/off\nShift Enter pour console on/off\nShift Click gauche pour selectionner un brin");

	CGoGNout.toStatusBar(&sqt);
	CGoGNout << "CGoGNOut StatusBar" << Geom::Vec3f(2.5f, 2.2f, 4.3f) << CGoGNendl;

	CGoGNout.toConsole(&sqt);

	CGoGNout << "CGoGNOut dans la console" << Geom::Vec3f(2.5f, 2.2f, 4.3f) << CGoGNendl;

	CGoGNout.toStatusBar(NULL);

325
	//  bounding box
Sylvain Thery's avatar
Sylvain Thery committed
326
    Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position);
327
328
    float lWidthObj = std::max<PFP::REAL>(std::max<PFP::REAL>(bb.size(0), bb.size(1)), bb.size(2));
    Geom::Vec3f lPosObj = (bb.min() +  bb.max()) / PFP::REAL(2);
Pierre Kraemer's avatar
Pierre Kraemer committed
329

330
    // envoit info BB a l'interface
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
331
	sqt.setParamObject(lWidthObj, lPosObj.data());
Pierre Kraemer's avatar
Pierre Kraemer committed
332

Sylvain Thery's avatar
Sylvain Thery committed
333
334
335
	sqt.setCallBack( dock.checkBox_balls, SIGNAL(toggled(bool)), SLOT(balls_onoff(bool)) );
	sqt.setCallBack( dock.checkBox_vectors, SIGNAL(toggled(bool)), SLOT(vectors_onoff(bool)) );
	sqt.setCallBack( dock.checkBox_text, SIGNAL(toggled(bool)), SLOT(text_onoff(bool)) );
336
	sqt.setCallBack( dock.checkBox_topo, SIGNAL(toggled(bool)), SLOT(topo_onoff(bool)) );
Pierre Kraemer's avatar
Pierre Kraemer committed
337

Sylvain Thery's avatar
Sylvain Thery committed
338
339
340
	sqt.setCallBack( dock.slider_balls, SIGNAL(valueChanged(int)), SLOT(slider_balls(int)) );
	sqt.setCallBack( dock.slider_vectors, SIGNAL(valueChanged(int)), SLOT(slider_vectors(int)) );
	sqt.setCallBack( dock.slider_text, SIGNAL(valueChanged(int)), SLOT(slider_text(int)) );
Pierre Kraemer's avatar
Pierre Kraemer committed
341

342
	sqt.show();
Pierre Kraemer's avatar
Pierre Kraemer committed
343

Sylvain Thery's avatar
Sylvain Thery committed
344
345
346
347
348
349
350
351
352
353
354
	sqt.slider_balls(50);
	sqt.slider_vectors(50);
	sqt.slider_text(50);

	GLint texSize;
	glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);
	CGoGNdbg.toConsole(&sqt);
	CGoGNerr.toConsole(&sqt);
	CGoGNdbg << " TextureSize " <<  texSize << CGoGNendl;
	CGoGNerr << " test ERROR  " <<  5*7 << CGoGNflush;

Pierre Kraemer's avatar
Pierre Kraemer committed
355
356


357
358
	// et on attend la fin.
	return app.exec();
Pierre Kraemer's avatar
Pierre Kraemer committed
359
}