tuto5.cpp 9.84 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
#include "tuto5.h"
Sylvain Thery's avatar
Sylvain Thery committed
26
27
#include <iostream>

untereiner's avatar
untereiner committed
28
#include "Algo/Tiling/Volume/cubic.h"
Sylvain Thery's avatar
Sylvain Thery committed
29
30
#include "Algo/Modelisation/polyhedron.h"
#include "Algo/Modelisation/subdivision.h"
untereiner's avatar
untereiner committed
31
#include "Algo/Modelisation/subdivision3.h"
Sylvain Thery's avatar
Sylvain Thery committed
32
33
34
35

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

Sylvain Thery's avatar
Sylvain Thery committed
36
37
#include <QTimer>

Pierre Kraemer's avatar
Pierre Kraemer committed
38
MAP myMap;
Pierre Kraemer's avatar
Pierre Kraemer committed
39

40
VertexAttribute<VEC3, MAP> position ;
Sylvain Thery's avatar
Sylvain Thery committed
41
42
Dart dglobal;

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

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
}

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


65
void MyQT::topo_onoff(bool /*x*/)
Sylvain Thery's avatar
Sylvain Thery committed
66
67
68
69
{
	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
void MyQT::animate()
91
{
Sylvain Thery's avatar
Sylvain Thery committed
92
93
94
//	transfoMatrix() = glm::rotate(transfoMatrix(), 0.5f, glm::vec3(0.5773f,0.5773f,0.5773f));
	transfoRotate( 0.5f, 0.5773f,0.5773f,0.5773f);
	updateGLMatrices();
95
	updateGL();
untereiner's avatar
untereiner committed
96
97
}

Sylvain Thery's avatar
Sylvain Thery committed
98
void MyQT::storeVerticesInfo()
untereiner's avatar
untereiner committed
99
{
Pierre Kraemer's avatar
Pierre Kraemer committed
100
	CellMarker<MAP, VERTEX> mv(myMap);
Pierre Kraemer's avatar
Pierre Kraemer committed
101
	for (Dart d = myMap.begin(); d != myMap.end(); myMap.next(d))
Sylvain Thery's avatar
Sylvain Thery committed
102
103
104
105
106
107
	{
		if (!mv.isMarked(d))
		{
			mv.mark(d);
			std::stringstream ss;
			ss << d << " : "<< position[d];
Pierre Kraemer's avatar
Pierre Kraemer committed
108
			m_strings->addString(ss.str(), position[d]);
Sylvain Thery's avatar
Sylvain Thery committed
109
110
		}
	}
111
}
112

Sylvain Thery's avatar
Sylvain Thery committed
113
void MyQT::cb_initGL()
Pierre Kraemer's avatar
Pierre Kraemer committed
114
{
Sylvain Thery's avatar
Sylvain Thery committed
115
116
117
	// create the render
	m_render = new Algo::Render::GL2::MapRender();

Pierre Kraemer's avatar
Pierre Kraemer committed
118
	m_render_topo = new Algo::Render::GL2::Topo3RenderMap<PFP>();
Sylvain Thery's avatar
Sylvain Thery committed
119
120
121
122
123
124
125
126
127
128
129
130

 	// 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);
131
	m_sprite->setColor(Geom::Vec4f(1.0f, 0.0f , 0.0f, 1.0f));
Sylvain Thery's avatar
Sylvain Thery committed
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

    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);
158

159
160
161
	m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::TRIANGLES);
	m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::LINES);
	m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::POINTS);
162

163
//	SelectorDartNoBoundary<PFP::MAP> nb(myMap);
Pierre Kraemer's avatar
Pierre Kraemer committed
164
	m_render_topo->updateData(myMap, position,  0.9f, 0.9f, 0.9f); // nb
165

Sylvain Thery's avatar
Sylvain Thery committed
166
167
168
169
	// timer example for animation
	m_timer = new QTimer( this );
	connect( m_timer, SIGNAL(timeout()), SLOT(animate()) );
}
170

Sylvain Thery's avatar
Sylvain Thery committed
171
172
173
174
void MyQT::cb_redraw()
{
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glEnable(GL_LIGHTING);
175

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

Sylvain Thery's avatar
Sylvain Thery committed
178
179
180
	glLineWidth(2.0f);
	m_shader->setColor(Geom::Vec4f(1.,1.,0.,0.));
	m_render->draw(m_shader, Algo::Render::GL2::LINES);
181

Sylvain Thery's avatar
Sylvain Thery committed
182
183
	glEnable(GL_POLYGON_OFFSET_FILL);
	glPolygonOffset(1.0f, 1.0f);
184

Sylvain Thery's avatar
Sylvain Thery committed
185
186
	if (render_topo)
		m_render_topo->drawTopo();
187

188
/*	Dart d = myMap.phi2(myMap.begin());
Sylvain Thery's avatar
Sylvain Thery committed
189
190
191
	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);
192
193
194
*/	
	m_render_topo->overdrawDart(m_selected, 5, 1.0f, 0.0f, 1.0f);
	
Sylvain Thery's avatar
Sylvain Thery committed
195
	glDisable(GL_POLYGON_OFFSET_FILL);
196

Sylvain Thery's avatar
Sylvain Thery committed
197
198
	if (render_text)
		m_strings->drawAll(Geom::Vec3f(0.0f, 1.0f, 1.0f));
199

Sylvain Thery's avatar
Sylvain Thery committed
200
201
202
203
	if (render_balls)
	{
		m_render->draw(m_sprite, Algo::Render::GL2::POINTS);
	}
204

Sylvain Thery's avatar
Sylvain Thery committed
205
206
207
208
209
210
	if (render_vectors)
	{
		glLineWidth(1.0f);
		m_render->draw(m_lines, Algo::Render::GL2::POINTS);
	}
}
211

212
void MyQT::cb_mousePress(int /*button*/, int x, int y)
Sylvain Thery's avatar
Sylvain Thery committed
213
214
215
{
	if (Shift())
	{
216
//		SelectorDartNoBoundary<PFP::MAP> nb(myMap);
Pierre Kraemer's avatar
Pierre Kraemer committed
217
		Dart d = m_render_topo->picking(myMap, x,y); // nb
Sylvain Thery's avatar
Sylvain Thery committed
218
219
220
		if (d != Dart::nil())
		{
			CGoGNout << "Dart "<< d << " clicked" << CGoGNendl;
221
			m_selected = d;
Sylvain Thery's avatar
Sylvain Thery committed
222
223
224
225
226
		}
		else
		{
			statusMsg("");
		}
227
		updateGL();
Sylvain Thery's avatar
Sylvain Thery committed
228
229
	}
}
230

Sylvain Thery's avatar
Sylvain Thery committed
231
232
233
234
void MyQT::cb_keyPress(int code)
{
	if (code  == 's')
	{
235
		std::string filename = selectFileSave("Export SVG file ",".","(*.svg)");
Pierre Kraemer's avatar
Pierre Kraemer committed
236
		Utils::SVG::SVGOut svg(filename, modelViewMatrix(), projectionMatrix());
237
238
//		svg.setWidth(1.0f);
//		svg.setColor(Geom::Vec3f(0.0f,0.0f,0.5f));
Pierre Kraemer's avatar
Pierre Kraemer committed
239
		Algo::Render::SVG::renderEdges<PFP>(svg, myMap, position);
240
241
//		svg.setColor(Geom::Vec3f(0.0f,0.8f,0.0f));
//		svg.setWidth(5.0f);
Pierre Kraemer's avatar
Pierre Kraemer committed
242
		Algo::Render::SVG::renderVertices<PFP>(svg, myMap, position);
243
	//	svg.setColor(Geom::Vec3f(1.0f,0.0f,0.0f));
Sylvain Thery's avatar
Sylvain Thery committed
244
		m_strings->toSVG(svg);
Sylvain Thery's avatar
Sylvain Thery committed
245
246
247
248
249
250
251
252
253
		//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
254
255
256

	if(code == 'c')
	{
257
		//SelectorDartNoBoundary<PFP::MAP> nb(myMap);
258
		Algo::Volume::Modelisation::catmullClarkVol<PFP>(myMap, position);
untereiner's avatar
untereiner committed
259
260

		m_positionVBO->updateData(position);
261
262
263
		m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::TRIANGLES);
		m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::LINES);
		m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::POINTS);
untereiner's avatar
untereiner committed
264

Pierre Kraemer's avatar
Pierre Kraemer committed
265
		m_render_topo->updateData(myMap, position, 0.9f, 0.9f, 0.9f);
untereiner's avatar
untereiner committed
266
	}
Sylvain Thery's avatar
Sylvain Thery committed
267
}
Sylvain Thery's avatar
bug    
Sylvain Thery committed
268

Sylvain Thery's avatar
Sylvain Thery committed
269
270
int main(int argc, char **argv)
{
271
	position = myMap.addAttribute<VEC3, VERTEX, MAP>("position");
untereiner's avatar
untereiner committed
272

Sylvain Thery's avatar
Sylvain Thery committed
273
	CGoGNout << 5.34 << " toto "<< Geom::Vec3f(2.5f, 2.2f, 4.3f) << CGoGNendl;
Pierre Kraemer's avatar
Pierre Kraemer committed
274
	CGoGNout << 3 << " tutu "<< 4 << CGoGNendl;
untereiner's avatar
untereiner committed
275

Sylvain Thery's avatar
Sylvain Thery committed
276
277
278
	int nb=3;
	if (argc>1)
		nb = atoi(argv[1]);
untereiner's avatar
untereiner committed
279
280
281
    Algo::Volume::Tilings::Cubic::Grid<PFP> cubic(myMap, nb, nb, nb);
    cubic.embedIntoGrid(position, 1.0f, 1.0f, 1.0f);
    dglobal = NIL;
untereiner's avatar
untereiner committed
282

Sylvain Thery's avatar
Sylvain Thery committed
283
284
285
    // un peu d'interface
	QApplication app(argc, argv);
	MyQT sqt;
Pierre Kraemer's avatar
Pierre Kraemer committed
286

287
288
289
	// interface de tuto5.ui
    Utils::QT::uiDockInterface dock;
    sqt.setDock(&dock);
Pierre Kraemer's avatar
Pierre Kraemer committed
290

Sylvain Thery's avatar
Sylvain Thery committed
291
292
293
294
295
296
297
298
299
300
 	// 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;

Sylvain Thery's avatar
Sylvain Thery committed
301
	CGoGNout.noStatusBar();
Sylvain Thery's avatar
Sylvain Thery committed
302

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

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

Sylvain Thery's avatar
Sylvain Thery committed
311
312
313
	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)) );
314
	sqt.setCallBack( dock.checkBox_topo, SIGNAL(toggled(bool)), SLOT(topo_onoff(bool)) );
Pierre Kraemer's avatar
Pierre Kraemer committed
315

Sylvain Thery's avatar
Sylvain Thery committed
316
317
318
	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
319

320
321
	sqt.m_selected = myMap.begin();

Sylvain Thery's avatar
Sylvain Thery committed
322
	sqt.setGeometry(100,100,1024,1024);
323
	sqt.show();
Pierre Kraemer's avatar
Pierre Kraemer committed
324

Sylvain Thery's avatar
Sylvain Thery committed
325
326
327
328
329
330
331
332
333
334
335
	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;

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