Création d'un compte pour un collaborateur extérieur au laboratoire depuis l'intranet ICube : https://intranet.icube.unistra.fr/fr/labs/member/profile

topo3Render.hpp 14.7 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
25
26
27
28
29
30
31
32
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#include "Geometry/vector_gen.h"
#include "Topology/generic/autoAttributeHandler.h"
#include "Topology/generic/dartmarker.h"
#include "Topology/generic/cellmarker.h"

#include "Topology/map/map3.h"
#include "Topology/gmap/gmap3.h"

33
34
35
#include "Topology/generic/traversorCell.h"
#include "Algo/Geometry/centroid.h"

Pierre Kraemer's avatar
Pierre Kraemer committed
36
37
38
39
40
41
42
43
44
namespace CGoGN
{

namespace Algo
{

namespace Render
{

Sylvain Thery's avatar
Sylvain Thery committed
45
namespace GL2
Pierre Kraemer's avatar
Pierre Kraemer committed
46
{
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
template<typename PFP>
void Topo3Render::updateData(typename PFP::MAP& map, const typename PFP::TVEC3& positions, float ke, float kf, float kv, const FunctorSelect& good)
{
	Map3* ptrMap3 = dynamic_cast<Map3*>(&map);
	if (ptrMap3 != NULL)
	{
		updateDataMap3<PFP>(map,positions,ke,kf,kv,good);
	}
	GMap3* ptrGMap3 = dynamic_cast<GMap3*>(&map);
	if (ptrGMap3 != NULL)
	{
		updateDataGMap3<PFP>(map,positions,ke,kf,kv,good);
	}
}

Pierre Kraemer's avatar
Pierre Kraemer committed
62
63

template<typename PFP>
64
void Topo3Render::updateDataMap3(typename PFP::MAP& mapx, const typename PFP::TVEC3& positions, float ke, float kf, float kv, const FunctorSelect& good)
Pierre Kraemer's avatar
Pierre Kraemer committed
65
{
66

Pierre Kraemer's avatar
Pierre Kraemer committed
67
68
69
70
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;


Sylvain Thery's avatar
Sylvain Thery committed
71
72
	if (m_attIndex.map() != &mapx)
		m_attIndex  = mapx.template getAttribute<unsigned int>(DART, "dart_index");
Sylvain Thery's avatar
Sylvain Thery committed
73
74
75

	if (!m_attIndex.isValid())
		m_attIndex  = mapx.template addAttribute<unsigned int>(DART, "dart_index");
Pierre Kraemer's avatar
Pierre Kraemer committed
76
77

	m_nbDarts = 0;
Sylvain Thery's avatar
Sylvain Thery committed
78
	for (Dart d = mapx.begin(); d != mapx.end(); mapx.next(d))
Pierre Kraemer's avatar
Pierre Kraemer committed
79
80
	{
		if (good(d))
81
82
83
84
			m_nbDarts++;
	}

	// compute center of each volumes
Sylvain Thery's avatar
Sylvain Thery committed
85
86
87
	CellMarker cmv(mapx,VOLUME);
	AutoAttributeHandler<VEC3> centerVolumes(mapx,VOLUME,"centerVolumes");

88
	Algo::Geometry::computeCentroidVolumes<PFP>(mapx,positions,centerVolumes, allDarts);
Pierre Kraemer's avatar
Pierre Kraemer committed
89
90

	// debut phi1
Sylvain Thery's avatar
Sylvain Thery committed
91
	AutoAttributeHandler<VEC3> fv1(mapx, DART);
Pierre Kraemer's avatar
Pierre Kraemer committed
92
	// fin phi1
Sylvain Thery's avatar
Sylvain Thery committed
93
	AutoAttributeHandler<VEC3> fv11(mapx, DART);
Pierre Kraemer's avatar
Pierre Kraemer committed
94
95

	// phi2
Sylvain Thery's avatar
Sylvain Thery committed
96
97
	AutoAttributeHandler<VEC3> fv2(mapx, DART);
	AutoAttributeHandler<VEC3> fv2x(mapx, DART);
Pierre Kraemer's avatar
Pierre Kraemer committed
98

99
100
101
	m_vbo4->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(VEC3), 0, GL_STREAM_DRAW);
	GLvoid* ColorDartsBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
Pierre Kraemer's avatar
Pierre Kraemer committed
102
103
	VEC3* colorDartBuf = reinterpret_cast<VEC3*>(ColorDartsBuffer);

104
105
106
	m_vbo0->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(VEC3), 0, GL_STREAM_DRAW);
	GLvoid* PositionDartsBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
Pierre Kraemer's avatar
Pierre Kraemer committed
107
108
109
	VEC3* positionDartBuf = reinterpret_cast<VEC3*>(PositionDartsBuffer);


110
	std::vector<Dart> vecDartFaces;
Sylvain Thery's avatar
Sylvain Thery committed
111
	vecDartFaces.reserve(m_nbDarts/3);
112
	unsigned int posDBI=0;
Pierre Kraemer's avatar
Pierre Kraemer committed
113

114
	// traverse each face of each volume
115
	TraversorCell<typename PFP::MAP> traFace(mapx, PFP::MAP::ORBIT_IN_PARENT(FACE),allDarts);
116
	for (Dart d=traFace.begin(); d!=traFace.end(); d=traFace.next())
Pierre Kraemer's avatar
Pierre Kraemer committed
117
	{
118
119
120
121
122
123
124
125
126
127
128
129
		vecDartFaces.push_back(d);

		std::vector<VEC3> vecPos;
		vecPos.reserve(16);

		// store the face & center
		float okv = 1.0f - kv;

		VEC3 vc = centerVolumes[d];
		VEC3 centerFace(0, 0, 0);
		Dart dd = d;
		do
Pierre Kraemer's avatar
Pierre Kraemer committed
130
		{
131
132
133
134
			VEC3 P = positions[dd];
			P  = vc*okv + P*kv;
			vecPos.push_back(P);
			centerFace += P;
Sylvain Thery's avatar
Sylvain Thery committed
135
			dd = mapx.phi1(dd);
136
137
		} while (dd != d);
		centerFace /= REAL(vecPos.size());
Pierre Kraemer's avatar
Pierre Kraemer committed
138

139
140
		//shrink the face
		unsigned int nb = vecPos.size();
Pierre Kraemer's avatar
Pierre Kraemer committed
141

142
		float okf = 1.0f - kf;
Pierre Kraemer's avatar
Pierre Kraemer committed
143

144
145
146
147
148
		for (unsigned int i = 0; i < nb; ++i)
		{
			vecPos[i] = centerFace*okf + vecPos[i]*kf;
		}
		vecPos.push_back(vecPos.front()); // copy the first for easy computation on next loop
Pierre Kraemer's avatar
Pierre Kraemer committed
149

150
151
152
153
		// compute position of points to use for drawing topo
		float oke = 1.0f - ke;
		for (unsigned int i = 0; i < nb; ++i)
		{
154
155
156
157
			if (good(d))
			{
				VEC3 P = vecPos[i]*ke + vecPos[i+1]*oke;
				VEC3 Q = vecPos[i+1]*ke + vecPos[i]*oke;
158

159
160
				m_attIndex[d] = posDBI;
				posDBI+=2;
Pierre Kraemer's avatar
Pierre Kraemer committed
161

162
163
164
165
				*positionDartBuf++ = P;
				*positionDartBuf++ = Q;
				*colorDartBuf++ = m_dartsColor;
				*colorDartBuf++ = m_dartsColor;
Pierre Kraemer's avatar
Pierre Kraemer committed
166

167
168
				fv1[d] = P*0.1f + Q*0.9f;
				fv11[d] = P*0.9f + Q*0.1f;
Pierre Kraemer's avatar
Pierre Kraemer committed
169

170
171
172
				fv2[d] = P*0.52f + Q*0.48f;
				fv2x[d] = P*0.48f + Q*0.52f;
			}
Pierre Kraemer's avatar
Pierre Kraemer committed
173

Sylvain Thery's avatar
Sylvain Thery committed
174
			d = mapx.phi1(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
175
176
177
		}
	}

178
179
	m_vbo0->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);
Pierre Kraemer's avatar
Pierre Kraemer committed
180

181
182
183
	m_vbo4->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);

Pierre Kraemer's avatar
Pierre Kraemer committed
184

185
186
187
	VEC3* positioniF1 = new VEC3[ 2*m_nbDarts];
	VEC3* positioniF2 = new VEC3[ 2*m_nbDarts];
	VEC3* positioniF3 = new VEC3[ 2*m_nbDarts];
Pierre Kraemer's avatar
Pierre Kraemer committed
188

189
190
191
	VEC3* positionF1 = positioniF1;
	VEC3* positionF2 = positioniF2;
	VEC3* positionF3 = positioniF3;
Pierre Kraemer's avatar
Pierre Kraemer committed
192

193
	m_nbRel1=0;
Pierre Kraemer's avatar
Pierre Kraemer committed
194
195
196
197
198
199
200
201
	m_nbRel2=0;
	m_nbRel3=0;

	for(std::vector<Dart>::iterator face = vecDartFaces.begin(); face != vecDartFaces.end(); ++face)
	{
		Dart d = *face;
		do
		{
Sylvain Thery's avatar
Sylvain Thery committed
202
			Dart e = mapx.phi2(d);
203
			if ((d < e) && good(d) && good(e))
Pierre Kraemer's avatar
Pierre Kraemer committed
204
205
206
207
208
209
210
			{
				*positionF2++ = fv2[d];
				*positionF2++ = fv2x[e];
				*positionF2++ = fv2[e];
				*positionF2++ = fv2x[d];
				m_nbRel2++;
			}
Sylvain Thery's avatar
Sylvain Thery committed
211
			e = mapx.phi3(d);
212
			if (!mapx.isBoundaryMarked(e) && (d < e) && good(d) && good(e))
Pierre Kraemer's avatar
Pierre Kraemer committed
213
214
215
216
217
218
219
			{
				*positionF3++ = fv2[d];
				*positionF3++ = fv2x[e];
				*positionF3++ = fv2[e];
				*positionF3++ = fv2x[d];
				m_nbRel3++;
			}
Sylvain Thery's avatar
Sylvain Thery committed
220
			e = mapx.phi1(d);
221
222
223
224
225
226
			if (good(d) && good(e))
			{
				*positionF1++ = fv1[d];
				*positionF1++ = fv11[e];
				m_nbRel1++;
			}
Sylvain Thery's avatar
Sylvain Thery committed
227
			d = mapx.phi1(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
228
229
230
		} while (d != *face );
	}

231
	m_vbo3->bind();
232
	glBufferData(GL_ARRAY_BUFFER, 4*m_nbRel3*sizeof(typename PFP::VEC3), positioniF3, GL_STREAM_DRAW);
Pierre Kraemer's avatar
Pierre Kraemer committed
233

234
	m_vbo2->bind();
235
	glBufferData(GL_ARRAY_BUFFER, 4*m_nbRel2*sizeof(typename PFP::VEC3), positioniF2, GL_STREAM_DRAW);
Pierre Kraemer's avatar
Pierre Kraemer committed
236

237
	m_vbo1->bind();
238
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbRel1*sizeof(typename PFP::VEC3), positioniF1, GL_STREAM_DRAW);
Pierre Kraemer's avatar
Pierre Kraemer committed
239

240
241
242
	delete[] positioniF1;
	delete[] positioniF2;
	delete[] positioniF3;
Pierre Kraemer's avatar
Pierre Kraemer committed
243
}
Sylvain Thery's avatar
Sylvain Thery committed
244

245
246


247
template<typename PFP>
248
void Topo3Render::setDartsIdColor(typename PFP::MAP& map, const FunctorSelect& good)
249
{
250
251
	m_vbo4->bind();
	float* colorBuffer =  reinterpret_cast<float*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));
252
253
254
255
	unsigned int nb=0;

	for (Dart d = map.begin(); d != map.end(); map.next(d))
	{
256
		if (good(d))
257
		{
258
			if (nb < m_nbDarts)
259
			{
Sylvain Thery's avatar
Sylvain Thery committed
260
				float r,g,b;
261
				dartToCol(d, r,g,b);
262
				
Sylvain Thery's avatar
Sylvain Thery committed
263
264
265
266
267
268
269
				float* local = colorBuffer+3*m_attIndex[d]; // get the right position in VBO
				*local++ = r;
				*local++ = g;
				*local++ = b;
				*local++ = r;
				*local++ = g;
				*local++ = b;
270
271
272

				nb++;
			}
273
274
			else
			{
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
				CGoGNerr << "Error buffer too small for color picking (change the selector parameter ?)" << CGoGNendl;
				break;
			}
		}
	}
	glUnmapBuffer(GL_ARRAY_BUFFER);
}


template<typename PFP>
void Topo3Render::updateColors(typename PFP::MAP& map, const typename PFP::TVEC3& colors, const FunctorSelect& good)
{
	m_vbo4->bind();
	Geom::Vec3f* colorBuffer =  reinterpret_cast<Geom::Vec3f*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));
	unsigned int nb=0;

	for (Dart d = map.begin(); d != map.end(); map.next(d))
	{
		if (good(d))
		{
			if (nb < m_nbDarts)
			{
				colorBuffer[m_attIndex[d]] = colors[d];
				nb++;
			}
			else
			{
				CGoGNerr << "Error buffer too small for color picking (change the selector parameter ?)" << CGoGNendl;
303
				break;
304
			}
305
306
		}
	}
307
	glUnmapBuffer(GL_ARRAY_BUFFER);
308
309
}

310

Sylvain Thery's avatar
Sylvain Thery committed
311
template<typename PFP>
312
Dart Topo3Render::picking(typename PFP::MAP& map, int x, int y, const FunctorSelect& good)
Sylvain Thery's avatar
Sylvain Thery committed
313
314
315
316
317
318
319
320
{
	pushColors();
	setDartsIdColor<PFP>(map,good);
	Dart d = pickColor(x,y);
	popColors();
	return d;
}

321
322


Thomas's avatar
Thomas committed
323
template<typename PFP>
324
void Topo3Render::updateDataGMap3(typename PFP::MAP& mapx, const typename PFP::TVEC3& positions, float ke, float kf, float kv, const FunctorSelect& good)
Thomas's avatar
Thomas committed
325
{
326
327
328
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;

329
	GMap3& map = dynamic_cast<GMap3&>(mapx);	// TODO reflechir comment virer ce warning quand on compile avec PFP::MAP=Map3
330

Thomas's avatar
Thomas committed
331
332
333
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;

Sylvain Thery's avatar
Sylvain Thery committed
334
335
	if (m_attIndex.map() != &mapx)
		m_attIndex  = mapx.template getAttribute<unsigned int>(DART, "dart_index");
Sylvain Thery's avatar
Sylvain Thery committed
336
	if (!m_attIndex.isValid())
Sylvain Thery's avatar
Sylvain Thery committed
337
			m_attIndex  = mapx.template addAttribute<unsigned int>(DART, "dart_index");
Thomas's avatar
Thomas committed
338
339

	m_nbDarts = 0;
Sylvain Thery's avatar
Sylvain Thery committed
340
	for (Dart d = mapx.begin(); d != mapx.end(); mapx.next(d))
Thomas's avatar
Thomas committed
341
	{
342
		if (good(d))
343
344
345
346
			m_nbDarts++;
	}

	// compute center of each volumes
Sylvain Thery's avatar
Sylvain Thery committed
347
	AutoAttributeHandler<VEC3> centerVolumes(mapx,VOLUME,"centerVolumes");
Sylvain Thery's avatar
Sylvain Thery committed
348
	Algo::Geometry::computeCentroidVolumes<PFP>(mapx,positions,centerVolumes,good);
349
350
351


	// beta1
Sylvain Thery's avatar
Sylvain Thery committed
352
	AutoAttributeHandler<VEC3> fv1(mapx, DART);
353
	// beta2/3
Sylvain Thery's avatar
Sylvain Thery committed
354
355
	AutoAttributeHandler<VEC3> fv2(mapx, DART);
	AutoAttributeHandler<VEC3> fv2x(mapx, DART);
356
357
358
359
360
361
362
363
364
365
366

	m_vbo4->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(VEC3), 0, GL_STREAM_DRAW);
	GLvoid* ColorDartsBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
	VEC3* colorDartBuf = reinterpret_cast<VEC3*>(ColorDartsBuffer);

	m_vbo0->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(VEC3), 0, GL_STREAM_DRAW);
	GLvoid* PositionDartsBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
	VEC3* positionDartBuf = reinterpret_cast<VEC3*>(PositionDartsBuffer);

367
368

	std::vector<Dart> vecDartFaces;
Sylvain Thery's avatar
Sylvain Thery committed
369
	vecDartFaces.reserve(m_nbDarts/6);
370
371
372
	unsigned int posDBI=0;

	//traverse each face of each volume
Sylvain Thery's avatar
Sylvain Thery committed
373
	TraversorCell<typename PFP::MAP> traFace(mapx, PFP::MAP::ORBIT_IN_PARENT(FACE),good);
374
	for (Dart d=traFace.begin(); d!=traFace.end(); d=traFace.next())
375
	{
376
377
378
379
380
381
382
383
384
385
386
387
		vecDartFaces.push_back(d);

		std::vector<VEC3> vecPos;
		vecPos.reserve(16);

		// store the face & center
		float okv = 1.0f - kv;

		VEC3 vc = centerVolumes[d];
		VEC3 centerFace(0, 0, 0);
		Dart dd = d;
		do
388
		{
389
390
391
392
			VEC3 P = positions[dd];
			P  = vc*okv + P*kv;
			vecPos.push_back(P);
			centerFace += P;
Sylvain Thery's avatar
Sylvain Thery committed
393
			dd = mapx.phi1(dd);
394
395
		} while (dd != d);
		centerFace /= REAL(vecPos.size());
396

397
398
		//shrink the face
		unsigned int nb = vecPos.size();
399

400
		float okf = 1.0f - kf;
401

402
403
404
405
406
		for (unsigned int i = 0; i < nb; ++i)
		{
			vecPos[i] = centerFace*okf + vecPos[i]*kf;
		}
		vecPos.push_back(vecPos.front()); // copy the first for easy computation on next loop
407

408
409
410
411
412
413
		// compute position of points to use for drawing topo
		float oke = 1.0f - ke;
		for (unsigned int i = 0; i < nb; ++i)
		{
			VEC3 P = vecPos[i]*ke + vecPos[i+1]*oke;
			VEC3 Q = vecPos[i+1]*ke + vecPos[i]*oke;
414

415
416
			VEC3 PP = 0.52f*P + 0.48f*Q;
			VEC3 QQ = 0.52f*Q + 0.48f*P;
417

418
419
420
421
			*positionDartBuf++ = P;
			*positionDartBuf++ = PP;
			*positionDartBuf++ = Q;
			*positionDartBuf++ = QQ;
422
423
424
425
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
426

427
428
			m_attIndex[d] = posDBI;
			posDBI+=2;
429
430


431
432
433
434
435
436
437
			fv1[d] = P*0.9f + PP*0.1f;
			fv2x[d] = P*0.52f + PP*0.48f;
			fv2[d] = P*0.48f + PP*0.52f;
			Dart dx = map.beta0(d);
			fv1[dx] = Q*0.9f + QQ*0.1f;
			fv2[dx] = Q*0.52f + QQ*0.48f;
			fv2x[dx] = Q*0.48f + QQ*0.52f;
438

439
440
			m_attIndex[dx] = posDBI;
			posDBI+=2;
441

Sylvain Thery's avatar
Sylvain Thery committed
442
			d = mapx.phi1(d);		}
443
444
445
446
447
	}

	m_vbo0->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);

448
449
450
451
	m_vbo4->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);

	// beta3
452
	m_vbo1->bind();
453
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(typename PFP::VEC3), 0, GL_STREAM_DRAW);
454
455
	GLvoid* PositionBuffer1 = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

456
	// beta3
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
	m_vbo2->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(typename PFP::VEC3), 0, GL_STREAM_DRAW);
	GLvoid* PositionBuffer2 = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

	// beta3
	m_vbo3->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(typename PFP::VEC3), 0, GL_STREAM_DRAW);
	GLvoid* PositionBuffer3 = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

	VEC3* positionF1 = reinterpret_cast<VEC3*>(PositionBuffer1);
	VEC3* positionF2 = reinterpret_cast<VEC3*>(PositionBuffer2);
	VEC3* positionF3 = reinterpret_cast<VEC3*>(PositionBuffer3);

	m_nbRel2=0;
	m_nbRel3=0;

	for(std::vector<Dart>::iterator face = vecDartFaces.begin(); face != vecDartFaces.end(); ++face)
	{
		Dart d = *face;
		do
		{
			Dart e = map.beta2(d);
			if (d < e)
			{
				*positionF2++ = fv2[d];
				*positionF2++ = fv2x[e];
				*positionF2++ = fv2[e];
				*positionF2++ = fv2x[d];
				m_nbRel2++;
			}
			e = map.beta3(d);
			if (!map.isBoundaryMarked(e) && (d < e))
			{
				*positionF3++ = fv2[d];
				*positionF3++ = fv2x[e];
				*positionF3++ = fv2[e];
				*positionF3++ = fv2x[d];
				m_nbRel3++;
			}
			d = map.beta0(d);
			e = map.beta2(d);
			if (d < e)
			{
				*positionF2++ = fv2[d];
				*positionF2++ = fv2x[e];
				*positionF2++ = fv2[e];
				*positionF2++ = fv2x[d];
				m_nbRel2++;
			}
			e = map.beta3(d);
507
			if (!map.isBoundaryMarked(e) && (d < e))
508
509
510
511
512
513
514
515
516
517
			{
				*positionF3++ = fv2[d];
				*positionF3++ = fv2x[e];
				*positionF3++ = fv2[e];
				*positionF3++ = fv2x[d];
				m_nbRel3++;
			}
			*positionF1++ = fv1[d];
			d = map.beta1(d);
			*positionF1++ = fv1[d];
518
			m_nbRel1++;
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
		} while (d != *face );
	}

	m_vbo3->bind();
	glUnmapBufferARB(GL_ARRAY_BUFFER);

	m_vbo2->bind();
	glUnmapBufferARB(GL_ARRAY_BUFFER);

	m_vbo1->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);

	m_vbo4->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);
}
Sylvain Thery's avatar
Sylvain Thery committed
534

535

536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556

template<typename PFP>
void Topo3Render::computeDartMiddlePositions(typename PFP::MAP& map, typename PFP::TVEC3& posExpl, const FunctorSelect& good)
{
	m_vbo0->bind();
	typename PFP::VEC3* positionsPtr = reinterpret_cast<typename PFP::VEC3*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY));

	for (Dart d = map.begin(); d != map.end(); map.next(d))
	{
		if (good(d))
		{
			posExpl[d] = (positionsPtr[m_attIndex[d]] + positionsPtr[m_attIndex[d]+1])*0.5f;
		}
	}

	m_vbo0->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);
}



Pierre Kraemer's avatar
Pierre Kraemer committed
557
558
559
560
561
562
563
}//end namespace VBO

}//end namespace Algo

}//end namespace Render

}//end namespace CGoGN