show_traversors.cpp 10.1 KB
Newer Older
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           *
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/                                           *
21 22 23 24 25
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/


26
#include "show_traversors.h"
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
#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"

#include "Topology/generic/traversor3.h"
#include "Topology/generic/traversor2.h"

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


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



void MyQT::cb_checkTopo(bool b)
{
	m_showTopo = b;
	updateGL();
}

void MyQT::cb_combo1(int x)
{
57 58
	m_first3 = x;
	if (m_first3!=m_second3)
59 60 61 62 63 64 65
		traverse3();
	else
		CGoGNerr <<"undefined traversor" << CGoGNendl;
}

void MyQT::cb_combo2(int x)
{
66 67
	m_ajd_or_inci3 = x;
	if (m_first3!=m_second3)
68 69 70 71 72 73 74
		traverse3();
	else
		CGoGNerr <<"undefined traversor" << CGoGNendl;
}

void MyQT::cb_combo3(int x)
{
75 76
	m_second3 = x;
	if (m_first3!=m_second3)
77 78 79 80 81 82 83
		traverse3();
	else
		CGoGNerr <<"undefined traversor" << CGoGNendl;
}

void MyQT::cb_combo4(int x)
{
84 85
	m_first2 = x;
	if (m_first2!=m_second2)
86 87 88 89 90 91 92
		traverse2();
	else
		CGoGNerr <<"undefined traversor" << CGoGNendl;
}

void MyQT::cb_combo5(int x)
{
93 94
	m_ajd_or_inci2 = x;
	if (m_first2!=m_second2)
95 96 97 98 99 100 101
		traverse2();
	else
		CGoGNerr <<"undefined traversor" << CGoGNendl;
}

void MyQT::cb_combo6(int x)
{
102 103
	m_second2 = x;
	if (m_first2!=m_second2)
104 105 106 107 108
		traverse2();
	else
		CGoGNerr <<"undefined traversor" << CGoGNendl;
}

Sylvain Thery's avatar
Sylvain Thery committed
109 110 111 112 113 114 115 116 117
void MyQT::cb_explode(int x)
{
	m_expl = float (x) /100.0f;
	if (m_last==2)
		traverse2();
	if (m_last==3)
		traverse3();
}

118 119 120 121 122 123 124 125 126 127

void MyQT::cb_initGL()
{
	// choose to use GL version 2
	Utils::GLSLShader::setCurrentOGLVersion(2);

    m_render_topo = new Algo::Render::GL2::Topo3Render();

	SelectorDartNoBoundary<PFP::MAP> nb(myMap);
	m_render_topo->updateData<PFP>(myMap, position,  0.95f, 0.9f, 0.8f, nb);
128
	m_dm_topo = new DartMarker(myMap);
129 130 131 132 133 134 135 136 137 138

}

void MyQT::cb_redraw()
{
	if (m_showTopo)
	{
		m_render_topo->drawTopo();

		if (m_selected != NIL)
139 140
			m_render_topo->overdrawDart(m_selected, 7, 1.0f, 0.0f, 1.0f);

141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
		for (std::vector<Dart>::iterator it=m_affDarts.begin(); it!=m_affDarts.end(); ++it)
		{
			m_render_topo->overdrawDart(*it, 6, 1.0f, 1.0f, 1.0f);
		}
	}

	m_drawer.callList();

}

void MyQT::cb_mousePress(int button, int x, int y)
{
	if (Shift())
	{
		SelectorDartNoBoundary<PFP::MAP> nb(myMap);	
		Dart d = m_render_topo->picking<PFP>(myMap, x,y, nb);
		if (d != Dart::nil())
		{
			CGoGNout << "Dart "<< d << " clicked" << CGoGNendl;
			m_selected = d;
		}
		updateGL();
	}
}


Sylvain Thery's avatar
Sylvain Thery committed
167 168
void  MyQT::cb_Save()
{
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
//	std::string filename = selectFileSave("Export SVG file ",".","(*.svg)");
//	Utils::SVG::SVGOut svg(filename,modelViewMatrix(),projectionMatrix());
//	m_drawer.toSVG(svg);
//	m_render_topo->toSVG(svg);

	Utils::SVG::SVGOut svg1(modelViewMatrix(),projectionMatrix());
	m_drawer.toSVG(svg1);
	svg1.addOpacityAnimation(1.0f);
	svg1.addOpacityAnimation(1.0f);
	svg1.addOpacityAnimation(0.0f);

	Utils::SVG::SVGOut svg2(modelViewMatrix(),projectionMatrix());
	m_render_topo->toSVG(svg2);
	svg2.addOpacityAnimation(1.0f);
	svg2.addOpacityAnimation(0.0f);
	svg2.addOpacityAnimation(1.0f);

	Utils::SVG::AnimatedSVGOut anim;

	anim.add(&svg1);
	anim.add(&svg2);

Sylvain Thery's avatar
Sylvain Thery committed
191
	std::string filename = selectFileSave("Export SVG file ",".","(*.svg)");
192 193 194 195

	anim.write(filename, 2.0f);


Sylvain Thery's avatar
Sylvain Thery committed
196 197
}

198 199 200 201 202 203 204 205 206 207 208 209
void MyQT::colorizeCell(Dart d, unsigned int orbit, float r,float g, float b)
{
	TraversorDartsOfOrbit<PFP::MAP>doo (myMap,orbit,d);
	for (Dart e = doo.begin(); e!=doo.end(); e = doo.next())
		m_render_topo->setDartColor(e,r,g,b);
}


void MyQT::traverse2()
{
	if (m_selected == NIL)
		return;
Sylvain Thery's avatar
Sylvain Thery committed
210
	m_last=2;
211
//	int code = (m_ajd_or_inci2)*100+m_first2*10+m_second2;
212 213 214
	SelectorDartNoBoundary<PFP::MAP> nb(myMap);

	m_drawer.newList(GL_COMPILE);
215 216
	m_drawer.lineWidth(7.0f);
	m_drawer.pointSize(9.0f);
Sylvain Thery's avatar
Sylvain Thery committed
217
	m_drawer.color3f(0.0f,0.7f,0.0f);
218 219 220

	m_affDarts.clear();

221
	if (m_ajd_or_inci2 == 0) // incident
222
	{
Sylvain Thery's avatar
Sylvain Thery committed
223
		Algo::Render::drawerCell<PFP>(VERTEX+m_second2, m_drawer,myMap,m_selected,position,m_expl);
224
		m_drawer.color3f(1.0f,0.0f,0.0f);
225

226 227 228
		Traversor2<PFP::MAP>* tra = Traversor2<PFP::MAP>::createIncident(myMap,m_selected,VERTEX+m_second2,VERTEX+m_first2);
		for (Dart d=tra->begin(); d != tra->end(); d= tra->next())
				m_affDarts.push_back(d);
Sylvain Thery's avatar
Sylvain Thery committed
229
		Algo::Render::drawerCells<PFP>(VERTEX+m_first2, m_drawer, myMap,m_affDarts,position,m_expl);
230
	}
231
	else	// adjacent
232
	{
Sylvain Thery's avatar
Sylvain Thery committed
233
		Algo::Render::drawerCell<PFP>(VERTEX+m_first2, m_drawer,myMap,m_selected,position,m_expl);
234
		m_drawer.color3f(1.0f,0.0f,0.0f);
235 236
		Traversor2<PFP::MAP>* tra = Traversor2<PFP::MAP>::createAdjacent(myMap,m_selected,VERTEX+m_first2,VERTEX+m_second2);

237

238 239
		for (Dart d=tra->begin(); d != tra->end(); d= tra->next())
				m_affDarts.push_back(d);
Sylvain Thery's avatar
Sylvain Thery committed
240
		Algo::Render::drawerCells<PFP>(VERTEX+m_first2, m_drawer, myMap,m_affDarts,position,m_expl);
241
	}
242

243
	m_drawer.endList();
244 245 246 247

	SelectorMarked sm(*m_dm_topo);
	m_render_topo->updateData<PFP>(myMap, position,  0.95f, 0.9f, 0.8f, sm );

248 249 250 251 252 253 254 255 256
	updateGL();
}



void MyQT::traverse3()
{
	if (m_selected == NIL)
		return;
Sylvain Thery's avatar
Sylvain Thery committed
257 258 259

	m_last=3;

260 261 262 263
	SelectorDartNoBoundary<PFP::MAP> nb(myMap);

	m_affDarts.clear();
	m_drawer.newList(GL_COMPILE);
264 265
	m_drawer.lineWidth(7.0f);
	m_drawer.pointSize(9.0f);
Sylvain Thery's avatar
Sylvain Thery committed
266
	m_drawer.color3f(0.0f,0.7f,0.0f);
267

268 269 270 271
	m_dm_topo->unmarkAll();
	SelectorMarked sm(*m_dm_topo);


272
	if (m_ajd_or_inci3 == 0) // incident
273
	{
Sylvain Thery's avatar
Sylvain Thery committed
274
		Algo::Render::drawerCell<PFP>(VERTEX+m_second3, m_drawer,myMap,m_selected,position,m_expl);
275
		m_dm_topo->markOrbit(VERTEX+m_second3,m_selected);
276
		m_drawer.color3f(1.0f,0.0f,0.0f);
277
		Traversor3XY<PFP::MAP> tra(myMap,m_selected,VERTEX+m_second3,VERTEX+m_first3);
278
		for (Dart d=tra.begin(); d != tra.end(); d= tra.next())
279 280 281 282
		{
			m_affDarts.push_back(d);
			m_dm_topo->markOrbit(VERTEX+m_first3,d);
		}
Sylvain Thery's avatar
Sylvain Thery committed
283
		Algo::Render::drawerCells<PFP>(VERTEX+m_first3, m_drawer, myMap,m_affDarts,position,m_expl);
284 285 286 287 288

		m_render_topo->updateData<PFP>(myMap, position,  0.95f, 0.9f, 0.8f, sm);
		for (std::vector<Dart>::iterator id=m_affDarts.begin(); id != m_affDarts.end(); ++id)
			m_render_topo->setDartColor(*id,0.7f,0.0f,0.0f);
		m_render_topo->setDartColor(m_selected,0.0f,0.7f,0.0f);
289
	}
290
	else	// adjacent
291
	{
Sylvain Thery's avatar
Sylvain Thery committed
292
		Algo::Render::drawerCell<PFP>(VERTEX+m_first3, m_drawer,myMap,m_selected,position,m_expl);
293
		m_dm_topo->markOrbit(VERTEX+m_first3,m_selected);
294
		m_drawer.color3f(1.0f,0.0f,0.0f);
295
		Traversor3XXaY<PFP::MAP> tra(myMap,m_selected,VERTEX+m_first3,VERTEX+m_second3);
296
		for (Dart d=tra.begin(); d != tra.end(); d= tra.next())
297 298 299 300
		{
			m_affDarts.push_back(d);
			m_dm_topo->markOrbit(VERTEX+m_first3,d);
		}
Sylvain Thery's avatar
Sylvain Thery committed
301
		Algo::Render::drawerCells<PFP>(VERTEX+m_first3, m_drawer, myMap,m_affDarts,position,m_expl);
302 303 304 305 306

		m_render_topo->updateData<PFP>(myMap, position,  0.95f, 0.9f, 0.8f, sm);
		for (std::vector<Dart>::iterator id=m_affDarts.begin(); id != m_affDarts.end(); ++id)
			m_render_topo->setDartColor(*id,0.7f,0.0f,0.0f);
		m_render_topo->setDartColor(m_selected,0.0f,0.7f,0.0f);
307 308 309
	}

	m_drawer.endList();
310 311 312



313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
	updateGL();
}



int main(int argc, char **argv)
{
	position = myMap.addAttribute<PFP::VEC3>(VERTEX, "position");

	Algo::Modelisation::Primitive3D<PFP> prim(myMap, position);
	dglobal = prim.hexaGrid_topo(4,4,4);
	prim.embedHexaGrid(1.0f,1.0f,1.0f);

    // un peu d'interface
	QApplication app(argc, argv);
	MyQT sqt;

	// interface de tuto5.ui
    Utils::QT::uiDockInterface dock;
    sqt.setDock(&dock);

 	// message d'aide
335
	sqt.setHelpMsg("shit click to select a dart\nand select a traversor\nif keyboard focus problem\nundock");
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353



	//  bounding box
    Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position);
    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);

    // envoit info BB a l'interface
	sqt.setParamObject(lWidthObj, lPosObj.data());

	sqt.setCallBack( dock.combo1, SIGNAL(	activated(int)), SLOT(cb_combo1(int)) );
	sqt.setCallBack( dock.combo2, SIGNAL(	activated(int)), SLOT(cb_combo2(int)) );
	sqt.setCallBack( dock.combo3, SIGNAL(	activated(int)), SLOT(cb_combo3(int)) );

	sqt.setCallBack( dock.combo4, SIGNAL(	activated(int)), SLOT(cb_combo4(int)) );
	sqt.setCallBack( dock.combo5, SIGNAL(	activated(int)), SLOT(cb_combo5(int)) );
	sqt.setCallBack( dock.combo6, SIGNAL(	activated(int)), SLOT(cb_combo6(int)) );
Sylvain Thery's avatar
Sylvain Thery committed
354
	sqt.setCallBack( dock.explodeSlider, SIGNAL(valueChanged(int)), SLOT(cb_explode(int)) );
355 356 357 358 359 360 361 362 363 364 365

	sqt.setCallBack( dock.checkTopo, SIGNAL(	clicked(bool)), SLOT(cb_checkTopo(bool)) );

	sqt.m_selected = NIL;

	sqt.show();


	// et on attend la fin.
	return app.exec();
}