tilings.cpp 9.53 KB
Newer Older
Lionel Untereiner's avatar
Lionel Untereiner committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
*                                                                              *
* 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.           *
*                                                                              *
* Web site: http://cgogn.unistra.fr/                                           *
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

untereiner's avatar
untereiner committed
25
#include "tilings.h"
Lionel Untereiner's avatar
Lionel Untereiner committed
26
27
28

#include "Geometry/vector_gen.h"

untereiner's avatar
untereiner committed
29
30
31
32
33
#include "Algo/Import/import.h"
#include "Algo/Geometry/boundingbox.h"
#include "Utils/GLSLShader.h"
//#include "Algo/Geometry/area.h"
#include "Algo/Geometry/normal.h"
untereiner's avatar
untereiner committed
34
35
#include "Geometry/matrix.h"
#include "Geometry/transfo.h"
Lionel Untereiner's avatar
Lionel Untereiner committed
36

untereiner's avatar
untereiner committed
37
38
#include "Utils/cgognStream.h"
#include "Utils/chrono.h"
Lionel Untereiner's avatar
Lionel Untereiner committed
39
40
41
42
43
44
45
46
47

using namespace CGoGN ;

/**
 * Struct that contains some informations about the types of the manipulated objects
 * Mainly here to be used by the algorithms that are parameterized by it
 */
struct PFP: public PFP_STANDARD
{
48
49
	// definition of the map
	typedef EmbeddedMap2 MAP;
Lionel Untereiner's avatar
Lionel Untereiner committed
50
51
};

untereiner's avatar
untereiner committed
52
53
54
55
56
57
58
59

PFP::MAP myMap;
VertexAttribute<PFP::VEC3> position;
VertexAttribute<PFP::VEC3> position2;
VertexAttribute<PFP::VEC3> normal;

void MyQT::cb_initGL()
{
60
	Utils::GLSLShader::setCurrentOGLVersion(2);
untereiner's avatar
untereiner committed
61

62
63
	// create the render
	m_render = new Algo::Render::GL2::MapRender();
untereiner's avatar
untereiner committed
64

65
66
67
	// create VBO for position
	m_positionVBO = new Utils::VBO();
	m_positionVBO->updateData(position);
untereiner's avatar
untereiner committed
68

69
	m_normalVBO =  new Utils::VBO();
untereiner's avatar
untereiner committed
70

71
72
73
	m_shader = new Utils::ShaderSimpleColor();
	m_shader->setAttributePosition(m_positionVBO);
	m_shader->setColor(Geom::Vec4f(1.,1.,0.,0.));
untereiner's avatar
untereiner committed
74
75


76
77
78
79
80
	m_lines = new Utils::ShaderVectorPerVertex();
	m_lines->setAttributePosition(m_positionVBO);
	m_lines->setAttributeVector(m_normalVBO);
	m_lines->setScale(0.2f);
	m_lines->setColor(Geom::Vec4f(0.0f, 1.0f, 0.2f, 0.0f));
untereiner's avatar
untereiner committed
81

82
	Algo::Surface::Geometry::computeNormalVertices<PFP>(myMap, position, normal) ;
untereiner's avatar
untereiner committed
83

84
85
	m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::LINES);
	m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::POINTS);
untereiner's avatar
untereiner committed
86

87
88
	registerShader(m_shader);
	registerShader(m_lines);
untereiner's avatar
untereiner committed
89

90
	m_normalVBO->updateData(normal);
untereiner's avatar
untereiner committed
91
92
93
94
95

}

void MyQT::cb_redraw()
{
96
97
98
99
100
101
102
103
104
105
106
107
	m_render->draw(m_shader, Algo::Render::GL2::LINES);
	m_render->draw(m_lines, Algo::Render::GL2::POINTS);
}

void MyQT::squareTiling(int code)
{
	switch(code)
	{
		case 1:
		{
			std::cout << "square grid tiling" << std::endl;
			Algo::Surface::Tilings::Square::Grid<PFP> g(myMap,10,10,true);
untereiner's avatar
untereiner committed
108
109
110
111
112
113
			g.embedIntoGrid(position,1.0,1.0, 0.0);

			Geom::Matrix44f trf;
			trf.identity();
			Geom::translate<float>(0.5,0.5,0.0,trf);
			g.transform(position, trf);
114

untereiner's avatar
untereiner committed
115
116
			g.exportPositions(position, "grid.bs");

117
118
119
120
121
122
			break;
		}
		case 2:
		{
			std::cout << "square grid twisted strip tiling" << std::endl;
			Algo::Surface::Tilings::Square::Grid<PFP> g(myMap,10,10,true);
untereiner's avatar
untereiner committed
123
124
125
126
127
128
129
			g.embedIntoTwistedStrip(position, 0.2, 0.7, 5);

			Geom::Matrix44f trf;
			trf.identity();
			Geom::translate<float>(0.5,0.5,0.0,trf);
			g.transform(position, trf);

130

untereiner's avatar
untereiner committed
131
132
			g.exportPositions(position, "gridtwisted.bs");

133
134
135
136
			break;
		}
		case 3:
		{
untereiner's avatar
untereiner committed
137
			std::cout << "square grid helicoid tiling" << std::endl;
138
			Algo::Surface::Tilings::Square::Grid<PFP> g(myMap,20,20,true);
untereiner's avatar
untereiner committed
139
140
141
142
143
144
145
			g.embedIntoHelicoid(position, 0.2,  0.3, 0.8, 2.0);

//			Geom::Matrix44f trf;
//			trf.identity();
//			Geom::translate<float>(0.5,0.5,0.0,trf);
//			g.transform(position, trf);

146

untereiner's avatar
untereiner committed
147
148
			g.exportPositions(position, "gridhelicoid.bs");

149
150
151
152
153
154
			break;
		}
		case 4:
		{
			std::cout << "square cylinder tiling" << std::endl;
			Algo::Surface::Tilings::Square::Cylinder<PFP> c(myMap,20,20);
untereiner's avatar
untereiner committed
155
156
157
158
159
160
161
			c.embedIntoCylinder(position,0.5,0.7,1.0);

			Geom::Matrix44f trf;
			trf.identity();
			Geom::translate<float>(0.5,0.5,0.0,trf);
			c.transform(position, trf);

162

untereiner's avatar
untereiner committed
163
164
			c.exportPositions(position, "cylinder.bs");

165
166
167
168
169
170
171
172
			break;
		}
		case 5:
		{
			std::cout << "square cylinder tiling" << std::endl;
			Algo::Surface::Tilings::Square::Cylinder<PFP> c(myMap,20,20);
			c.triangleBottom();
			c.triangleTop();
untereiner's avatar
untereiner committed
173
			c.embedIntoCylinder(position,0.5,0.7,1.0);
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192

			break;
		}
		case 6:
		{
			std::cout << "square cylinder sphere tiling" << std::endl;
			Algo::Surface::Tilings::Square::Cylinder<PFP> c(myMap,20,20);
			c.triangleTop();
			c.triangleBottom();
			c.embedIntoSphere(position,0.5);

			break;
		}
		case 7:
		{
			std::cout << "square cylinder cone tiling" << std::endl;
			Algo::Surface::Tilings::Square::Cylinder<PFP> c(myMap,20,20);
			c.triangleTop();
			c.triangleBottom();
untereiner's avatar
untereiner committed
193
			c.embedIntoCone(position,0.5, 1.0);
194
195
196
197
198

			break;
		}
		case 8:
		{
Lionel Untereiner's avatar
Lionel Untereiner committed
199
200
            std::cout << "square cube tiling" << std::endl;
            Algo::Surface::Tilings::Square::Cube<PFP> c(myMap,1,1,2);
untereiner's avatar
untereiner committed
201
202
203
204
205
206
			c.embedIntoCube(position,1.0, 1.0, 1.0);

			Geom::Matrix44f trf;
			trf.identity();
			Geom::translate<float>(0.5,0.5,0.5,trf);
			c.transform(position, trf);
207

untereiner's avatar
untereiner committed
208
209
			c.exportPositions(position, "cube.bs");

210
211
212
213
			break;
		}
		case 9:
		{
untereiner's avatar
untereiner committed
214
			std::cout << "square tore tiling" << std::endl;
215
			Algo::Surface::Tilings::Square::Tore<PFP> c(myMap,20,10);
untereiner's avatar
untereiner committed
216
			c.embedIntoTore(position, 0.9, 0.5);
217

untereiner's avatar
untereiner committed
218
			c.exportPositions(position, "tore.bs");
219
220
221
222
223
224
225
226
			break;
		}

		default:
		{
			break;
		}
	}
untereiner's avatar
untereiner committed
227
228

	myMap.check();
untereiner's avatar
untereiner committed
229
230
231
}

// mouse picking
232
void MyQT::triangularTiling(int code)
Lionel Untereiner's avatar
Lionel Untereiner committed
233
{
234
235
236
237
	switch(code)
	{
		case 1:
		{
untereiner's avatar
untereiner committed
238
239
240
			std::cout << "triangle grid tiling" << std::endl;
			Algo::Surface::Tilings::Triangular::Grid<PFP> g(myMap,10,6,true);
			g.embedIntoGrid(position,1,1);
241
242
243
244
245

			break;
		}
		case 2:
		{
untereiner's avatar
untereiner committed
246
247
248
			std::cout << "triangle grid twisted strip tiling" << std::endl;
			Algo::Surface::Tilings::Triangular::Grid<PFP> g(myMap,10,10,true);
			g.embedIntoTwistedStrip(position, 0.3, 0.8, 5);
249
250
251
252
253

			break;
		}
		case 3:
		{
untereiner's avatar
untereiner committed
254
255
256
			std::cout << "triangle grid helocoid tiling" << std::endl;
			Algo::Surface::Tilings::Triangular::Grid<PFP> g(myMap,20,20,true);
			g.embedIntoHelicoid(position, 0.3,  0.8, 5.0, 2.0);
257
258
259
260
261

			break;
		}
		case 4:
		{
untereiner's avatar
untereiner committed
262
263
264
			std::cout << "triangle cylinder tiling" << std::endl;
			Algo::Surface::Tilings::Triangular::Cylinder<PFP> c(myMap,20,20);
			c.embedIntoCylinder(position,0.5,0.7,5.0);
265
266
267
268
269

			break;
		}
		case 5:
		{
untereiner's avatar
untereiner committed
270
271
272
273
274
			std::cout << "triangle cylinder tiling" << std::endl;
			Algo::Surface::Tilings::Triangular::Cylinder<PFP> c(myMap,20,20);
			c.triangleBottom();
			c.triangleTop();
			c.embedIntoCylinder(position,0.5,0.7,5.0);
275
276
277
278
279

			break;
		}
		case 6:
		{
untereiner's avatar
untereiner committed
280
281
282
283
284
			std::cout << "triangle cylinder sphere tiling" << std::endl;
			Algo::Surface::Tilings::Triangular::Cylinder<PFP> c(myMap,20,20);
			c.triangleTop();
			c.triangleBottom();
			c.embedIntoSphere(position,0.5);
285
286
287
288
289

			break;
		}
		case 7:
		{
untereiner's avatar
untereiner committed
290
291
292
293
294
			std::cout << "triangle cylinder cone tiling" << std::endl;
			Algo::Surface::Tilings::Triangular::Cylinder<PFP> c(myMap,20,20);
			c.triangleTop();
			c.triangleBottom();
			c.embedIntoCone(position,0.5, 5.0);
295
296
297
298
299

			break;
		}
		case 8:
		{
Lionel Untereiner's avatar
Lionel Untereiner committed
300
301
302
            std::cout << "triangle cube tiling" << std::endl;
            Algo::Surface::Tilings::Triangular::Cube<PFP> c(myMap,4,4,4);
            c.embedIntoCube(position,5.0,5.0, 5.0);
303
304
305
306
307

			break;
		}
		case 9:
		{
Lionel Untereiner's avatar
Lionel Untereiner committed
308
309
310
            std::cout << "triangle tore tiling" << std::endl;
            Algo::Surface::Tilings::Triangular::Tore<PFP> c(myMap,20,10);
            c.embedIntoTore(position,5.0,2.0);
311
312
313
314
315
316
317
318
319

			break;
		}

		default:
		{
			break;
		}
	}
untereiner's avatar
untereiner committed
320
}
Lionel Untereiner's avatar
Lionel Untereiner committed
321

untereiner's avatar
untereiner committed
322
323
int main(int argc, char **argv)
{
324
325
326
	// interface:
	QApplication app(argc, argv);
	MyQT sqt;
untereiner's avatar
untereiner committed
327

328
329
	sqt.statusMsg("Neww to create a sphere or Load for a mesh file");
	CGoGNStream::allToConsole(&sqt);
Lionel Untereiner's avatar
Lionel Untereiner committed
330

331
332
	if (!position.isValid())
		position = myMap.addAttribute<PFP::VEC3, VERTEX>("position");
Lionel Untereiner's avatar
Lionel Untereiner committed
333

334
335
	if (!normal.isValid())
		normal = myMap.addAttribute<PFP::VEC3, VERTEX>("normal");
untereiner's avatar
untereiner committed
336

337
338
339
340
341
342
343
	if(argc == 3)
	{
		if(argv[1][0] == 'S')
			sqt.squareTiling(atoi(argv[2]));
		else if(argv[1][0] == 'T')
			sqt.triangularTiling(atoi(argv[2]));
	}
Lionel Untereiner's avatar
Lionel Untereiner committed
344
    myMap.check();
Lionel Untereiner's avatar
Lionel Untereiner committed
345

346
347
348
349
350
351
352
	//  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);
	CGoGNout << "lPosObj=" << lPosObj << CGoGNendl;
	CGoGNout << "lWidthObj=" << lWidthObj << CGoGNendl;
	sqt.setParamObject(lWidthObj,lPosObj.data());
untereiner's avatar
untereiner committed
353

354
355
	//	myMap.enableQuickTraversal<EDGE>() ;
	//	myMap.enableQuickTraversal<VERTEX>() ;
untereiner's avatar
untereiner committed
356

357
	sqt.show();
untereiner's avatar
untereiner committed
358
359


360
	return app.exec();
Lionel Untereiner's avatar
Lionel Untereiner committed
361
362
}