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


26
#include "tuto5.h"
Sylvain Thery's avatar
Sylvain Thery committed
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>


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

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


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

void MyQT::balls_onoff(bool x)
{
	render_balls = !render_balls;
45
	updateGL();
Sylvain Thery's avatar
Sylvain Thery committed
46
	CGoGNerr << " balls_onoff  "<< CGoGNendl;
47
}
48

Sylvain Thery's avatar
Sylvain Thery committed
49
void MyQT::vectors_onoff(bool x)
50
{
Sylvain Thery's avatar
Sylvain Thery committed
51
52
53
	render_vectors = !render_vectors;
	updateGL();
	CGoGNerr << " vectors_onoff  "<< CGoGNflush;
54
55
}

Sylvain Thery's avatar
Sylvain Thery committed
56
void MyQT::text_onoff(bool x)
Pierre Kraemer's avatar
Pierre Kraemer committed
57
{
Sylvain Thery's avatar
Sylvain Thery committed
58
59
60
	render_text = !render_text;
	updateGL();
	CGoGNerr << " text_onoff  " << CGoGNflush;
61
}
Pierre Kraemer's avatar
Pierre Kraemer committed
62
63


Sylvain Thery's avatar
Sylvain Thery committed
64
65
66
67
68
void MyQT::topo_onoff(bool x)
{
	render_topo = !render_topo;
	updateGL();
	CGoGNerr << " topo_onoff  " << CGoGNflush;
Pierre Kraemer's avatar
Pierre Kraemer committed
69
70
}

Sylvain Thery's avatar
Sylvain Thery committed
71
void MyQT::slider_balls(int x)
Sylvain Thery's avatar
Sylvain Thery committed
72
{
Sylvain Thery's avatar
Sylvain Thery committed
73
74
	m_sprite->setSize(0.05f*x);
	updateGL();
Sylvain Thery's avatar
Sylvain Thery committed
75
76
}

Sylvain Thery's avatar
Sylvain Thery committed
77
void MyQT::slider_vectors(int x)
78
{
Sylvain Thery's avatar
Sylvain Thery committed
79
80
	m_lines->setScale(0.02*x);
	updateGL();
81
82
}

Sylvain Thery's avatar
Sylvain Thery committed
83
void MyQT::slider_text(int x)
84
{
Sylvain Thery's avatar
Sylvain Thery committed
85
86
	m_strings->setScale(0.02f*x);
	updateGL();
87
}
88

Sylvain Thery's avatar
Sylvain Thery committed
89
90
91


void MyQT::animate()
92
{
Sylvain Thery's avatar
Sylvain Thery committed
93
94
95
//	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
96
97
98
}


Sylvain Thery's avatar
Sylvain Thery committed
99
void MyQT::storeVerticesInfo()
untereiner's avatar
untereiner committed
100
{
101

Sylvain Thery's avatar
Sylvain Thery committed
102
103
104
105
106
107
108
109
110
111
112
	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]);
		}
	}
113
}
114

Sylvain Thery's avatar
Sylvain Thery committed
115
void MyQT::cb_initGL()
Pierre Kraemer's avatar
Pierre Kraemer committed
116
{
Sylvain Thery's avatar
Sylvain Thery committed
117
118
119
120
121
122
	// choose to use GL version 2
	Utils::GLSLShader::setCurrentOGLVersion(2);

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

123
    m_render_topo = new Algo::Render::GL2::Topo3Render();
Sylvain Thery's avatar
Sylvain Thery committed
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

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

Sylvain Thery's avatar
Sylvain Thery committed
163
	SelectorTrue allDarts;
164

Sylvain Thery's avatar
Sylvain Thery committed
165
166
167
	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);
168

Sylvain Thery's avatar
Sylvain Thery committed
169
	SelectorDartNoBoundary<PFP::MAP> nb(myMap);
170
	m_render_topo->updateData<PFP>(myMap, position,  0.9f, 0.9f, 0.9f, nb);
171
172


Sylvain Thery's avatar
Sylvain Thery committed
173
174
175
176
	// timer example for animation
	m_timer = new QTimer( this );
	connect( m_timer, SIGNAL(timeout()), SLOT(animate()) );
}
177

Sylvain Thery's avatar
Sylvain Thery committed
178
179
180
181
void MyQT::cb_redraw()
{
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glEnable(GL_LIGHTING);
182

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

Sylvain Thery's avatar
Sylvain Thery committed
185
186
187
	glLineWidth(2.0f);
	m_shader->setColor(Geom::Vec4f(1.,1.,0.,0.));
	m_render->draw(m_shader, Algo::Render::GL2::LINES);
188

Sylvain Thery's avatar
Sylvain Thery committed
189
190
	glEnable(GL_POLYGON_OFFSET_FILL);
	glPolygonOffset(1.0f, 1.0f);
191

Sylvain Thery's avatar
Sylvain Thery committed
192
193
	if (render_topo)
		m_render_topo->drawTopo();
194

195
/*	Dart d = myMap.phi2(myMap.begin());
Sylvain Thery's avatar
Sylvain Thery committed
196
197
198
	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);
199
200
201
*/	
	m_render_topo->overdrawDart(m_selected, 5, 1.0f, 0.0f, 1.0f);
	
202

Sylvain Thery's avatar
Sylvain Thery committed
203
	glDisable(GL_POLYGON_OFFSET_FILL);
204

Sylvain Thery's avatar
Sylvain Thery committed
205
206
	if (render_text)
		m_strings->drawAll(Geom::Vec3f(0.0f, 1.0f, 1.0f));
207

Sylvain Thery's avatar
Sylvain Thery committed
208
209
210
211
212
213
	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();
	}
214

Sylvain Thery's avatar
Sylvain Thery committed
215
216
217
218
219
220
	if (render_vectors)
	{
		glLineWidth(1.0f);
		m_render->draw(m_lines, Algo::Render::GL2::POINTS);
	}
}
221

Sylvain Thery's avatar
Sylvain Thery committed
222
223
224
225
void MyQT::cb_mousePress(int button, int x, int y)
{
	if (Shift())
	{
226
227
		SelectorDartNoBoundary<PFP::MAP> nb(myMap);	
		Dart d = m_render_topo->picking<PFP>(myMap, x,y, nb);
Sylvain Thery's avatar
Sylvain Thery committed
228
229
230
		if (d != Dart::nil())
		{
			CGoGNout << "Dart "<< d << " clicked" << CGoGNendl;
231
			m_selected = d;
Sylvain Thery's avatar
Sylvain Thery committed
232
233
234
235
236
		}
		else
		{
			statusMsg("");
		}
237
		updateGL();
Sylvain Thery's avatar
Sylvain Thery committed
238
239
	}
}
240

Sylvain Thery's avatar
Sylvain Thery committed
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
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
261

Sylvain Thery's avatar
Sylvain Thery committed
262

Sylvain Thery's avatar
bug    
Sylvain Thery committed
263

Sylvain Thery's avatar
Sylvain Thery committed
264
265
266
int main(int argc, char **argv)
{
	position = myMap.addAttribute<PFP::VEC3>(VERTEX, "position");
untereiner's avatar
untereiner committed
267

Sylvain Thery's avatar
Sylvain Thery committed
268
269
	CGoGNout << 5.34 << " toto "<< Geom::Vec3f(2.5f, 2.2f, 4.3f) << CGoGNendl;
	CGoGNout << 3 << " tutu "<< 4 <<CGoGNendl;
untereiner's avatar
untereiner committed
270
271


Sylvain Thery's avatar
Sylvain Thery committed
272
273
274
275
276
277
	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
278

Sylvain Thery's avatar
Sylvain Thery committed
279
280
281
    // un peu d'interface
	QApplication app(argc, argv);
	MyQT sqt;
Pierre Kraemer's avatar
Pierre Kraemer committed
282

283
284
285
	// interface de tuto5.ui
    Utils::QT::uiDockInterface dock;
    sqt.setDock(&dock);
Pierre Kraemer's avatar
Pierre Kraemer committed
286

Sylvain Thery's avatar
Sylvain Thery committed
287
288
289
290
291
292
293
294
295
296
297
298
 	// 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);

299
	//  bounding box
Sylvain Thery's avatar
Sylvain Thery committed
300
    Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position);
301
302
    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
303

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

Sylvain Thery's avatar
Sylvain Thery committed
307
308
309
	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)) );
310
	sqt.setCallBack( dock.checkBox_topo, SIGNAL(toggled(bool)), SLOT(topo_onoff(bool)) );
Pierre Kraemer's avatar
Pierre Kraemer committed
311

Sylvain Thery's avatar
Sylvain Thery committed
312
313
314
	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
315

316
317
318

	sqt.m_selected = myMap.begin();

319
	sqt.show();
Pierre Kraemer's avatar
Pierre Kraemer committed
320

Sylvain Thery's avatar
Sylvain Thery committed
321
322
323
324
325
326
327
328
329
330
331
	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
332
333


334
335
	// et on attend la fin.
	return app.exec();
Pierre Kraemer's avatar
Pierre Kraemer committed
336
}