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
}