tuto5.cpp 9.79 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
#include <iostream>


#include "Algo/Modelisation/primitives3d.h"
#include "Algo/Modelisation/polyhedron.h"
#include "Algo/Modelisation/subdivision.h"
untereiner's avatar
untereiner committed
33
#include "Algo/Modelisation/subdivision3.h"
Sylvain Thery's avatar
Sylvain Thery committed
34
35
36
37
38
39
40
41
42
43
44
45

#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;
46
	updateGL();
Sylvain Thery's avatar
Sylvain Thery committed
47
	CGoGNerr << " balls_onoff  "<< CGoGNendl;
48
}
49

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

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


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

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

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

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

Sylvain Thery's avatar
Sylvain Thery committed
90
91
92


void MyQT::animate()
93
{
Sylvain Thery's avatar
Sylvain Thery committed
94
95
96
//	transfoMatrix() = glm::rotate(transfoMatrix(), 0.5f, glm::vec3(0.5773f,0.5773f,0.5773f));
	transfoRotate( 0.5f, 0.5773f,0.5773f,0.5773f);
	updateGLMatrices();
97
	updateGL();
untereiner's avatar
untereiner committed
98
99
100
}


Sylvain Thery's avatar
Sylvain Thery committed
101
void MyQT::storeVerticesInfo()
untereiner's avatar
untereiner committed
102
{
103

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

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

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

125
    m_render_topo = new Algo::Render::GL2::Topo3Render();
Sylvain Thery's avatar
Sylvain Thery committed
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
162
163

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

Sylvain Thery's avatar
Sylvain Thery committed
165
	SelectorTrue allDarts;
166

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

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


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

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

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

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

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

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

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

Sylvain Thery's avatar
Sylvain Thery committed
205
	glDisable(GL_POLYGON_OFFSET_FILL);
206

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

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

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

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

Sylvain Thery's avatar
Sylvain Thery committed
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
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
	}
untereiner's avatar
untereiner committed
262
263
264
265
266
267
268
269
270
271
272
273
274
275

	if(code == 'c')
	{
		SelectorDartNoBoundary<PFP::MAP> nb(myMap);
		Algo::Modelisation::catmullClarkVol<PFP>(myMap, position, nb);

		m_positionVBO->updateData(position);
		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);


		m_render_topo->updateData<PFP>(myMap, position,  0.9f, 0.9f, 0.9f, nb);
	}
Sylvain Thery's avatar
Sylvain Thery committed
276
}
Sylvain Thery's avatar
bug    
Sylvain Thery committed
277

Sylvain Thery's avatar
Sylvain Thery committed
278

Sylvain Thery's avatar
bug    
Sylvain Thery committed
279

Sylvain Thery's avatar
Sylvain Thery committed
280
281
282
int main(int argc, char **argv)
{
	position = myMap.addAttribute<PFP::VEC3>(VERTEX, "position");
untereiner's avatar
untereiner committed
283

Sylvain Thery's avatar
Sylvain Thery committed
284
285
	CGoGNout << 5.34 << " toto "<< Geom::Vec3f(2.5f, 2.2f, 4.3f) << CGoGNendl;
	CGoGNout << 3 << " tutu "<< 4 <<CGoGNendl;
untereiner's avatar
untereiner committed
286
287


Sylvain Thery's avatar
Sylvain Thery committed
288
289
290
291
292
293
	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
294

Sylvain Thery's avatar
Sylvain Thery committed
295
296
297
    // un peu d'interface
	QApplication app(argc, argv);
	MyQT sqt;
Pierre Kraemer's avatar
Pierre Kraemer committed
298

299
300
301
	// interface de tuto5.ui
    Utils::QT::uiDockInterface dock;
    sqt.setDock(&dock);
Pierre Kraemer's avatar
Pierre Kraemer committed
302

Sylvain Thery's avatar
Sylvain Thery committed
303
304
305
306
307
308
309
310
311
312
313
314
 	// 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);

315
	//  bounding box
Sylvain Thery's avatar
Sylvain Thery committed
316
    Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position);
317
318
    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
319

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

Sylvain Thery's avatar
Sylvain Thery committed
323
324
325
	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)) );
326
	sqt.setCallBack( dock.checkBox_topo, SIGNAL(toggled(bool)), SLOT(topo_onoff(bool)) );
Pierre Kraemer's avatar
Pierre Kraemer committed
327

Sylvain Thery's avatar
Sylvain Thery committed
328
329
330
	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
331

332
333
334

	sqt.m_selected = myMap.begin();

335
	sqt.show();
Pierre Kraemer's avatar
Pierre Kraemer committed
336

Sylvain Thery's avatar
Sylvain Thery committed
337
338
339
340
341
342
343
344
345
346
347
	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
348
349


350
351
	// et on attend la fin.
	return app.exec();
Pierre Kraemer's avatar
Pierre Kraemer committed
352
}