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
	if (m_attIndex.map() != &mapx)
Pierre Kraemer's avatar
Pierre Kraemer committed
72
	{
Sylvain Thery's avatar
Sylvain Thery committed
73
		m_attIndex  = mapx.template getAttribute<unsigned int>(DART, "dart_index");
Sylvain Thery's avatar
Sylvain Thery committed
74
		if (!m_attIndex.isValid())
Sylvain Thery's avatar
Sylvain Thery committed
75
			m_attIndex  = mapx.template addAttribute<unsigned int>(DART, "dart_index");
Pierre Kraemer's avatar
Pierre Kraemer committed
76 77 78
	}

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

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

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

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

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

100 101 102
	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
103 104
	VEC3* colorDartBuf = reinterpret_cast<VEC3*>(ColorDartsBuffer);

105 106 107
	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
108 109 110
	VEC3* positionDartBuf = reinterpret_cast<VEC3*>(PositionDartsBuffer);


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

115
	// traverse each face of each volume
116
	TraversorCell<typename PFP::MAP> traFace(mapx, PFP::MAP::ORBIT_IN_PARENT(FACE),allDarts);
117
	for (Dart d=traFace.begin(); d!=traFace.end(); d=traFace.next())
Pierre Kraemer's avatar
Pierre Kraemer committed
118
	{
119 120 121 122 123 124 125 126 127 128 129 130
		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
131
		{
132 133 134 135
			VEC3 P = positions[dd];
			P  = vc*okv + P*kv;
			vecPos.push_back(P);
			centerFace += P;
Sylvain Thery's avatar
Sylvain Thery committed
136
			dd = mapx.phi1(dd);
137 138
		} while (dd != d);
		centerFace /= REAL(vecPos.size());
Pierre Kraemer's avatar
Pierre Kraemer committed
139

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

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

145 146 147 148 149
		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
150

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

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

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

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

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

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

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

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

Pierre Kraemer's avatar
Pierre Kraemer committed
185

186 187 188
	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
189

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

194
	m_nbRel1=0;
Pierre Kraemer's avatar
Pierre Kraemer committed
195 196 197 198 199 200 201 202
	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
203
			Dart e = mapx.phi2(d);
204
			if ((d < e) && good(d) && good(e))
Pierre Kraemer's avatar
Pierre Kraemer committed
205 206 207 208 209 210 211
			{
				*positionF2++ = fv2[d];
				*positionF2++ = fv2x[e];
				*positionF2++ = fv2[e];
				*positionF2++ = fv2x[d];
				m_nbRel2++;
			}
Sylvain Thery's avatar
Sylvain Thery committed
212
			e = mapx.phi3(d);
213
			if (!mapx.isBoundaryMarked(e) && (d < e) && good(d) && good(e))
Pierre Kraemer's avatar
Pierre Kraemer committed
214 215 216 217 218 219 220
			{
				*positionF3++ = fv2[d];
				*positionF3++ = fv2x[e];
				*positionF3++ = fv2[e];
				*positionF3++ = fv2x[d];
				m_nbRel3++;
			}
Sylvain Thery's avatar
Sylvain Thery committed
221
			e = mapx.phi1(d);
222 223 224 225 226 227
			if (good(d) && good(e))
			{
				*positionF1++ = fv1[d];
				*positionF1++ = fv11[e];
				m_nbRel1++;
			}
Sylvain Thery's avatar
Sylvain Thery committed
228
			d = mapx.phi1(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
229 230 231
		} while (d != *face );
	}

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

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

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

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

246 247


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

	for (Dart d = map.begin(); d != map.end(); map.next(d))
	{
257
		if (good(d))
258
		{
259
			if (nb < m_nbDarts)
260
			{
Sylvain Thery's avatar
Sylvain Thery committed
261
				float r,g,b;
262
				dartToCol(d, r,g,b);
263
				
Sylvain Thery's avatar
Sylvain Thery committed
264 265 266 267 268 269 270
				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;
271 272 273

				nb++;
			}
274 275
			else
			{
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 303
				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;
304
				break;
305
			}
306 307
		}
	}
308
	glUnmapBuffer(GL_ARRAY_BUFFER);
309 310
}

311

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

322 323


Thomas's avatar
Thomas committed
324
template<typename PFP>
325
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
326
{
327 328 329
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;

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

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


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

	m_nbDarts = 0;
Sylvain Thery's avatar
Sylvain Thery committed
344
	for (Dart d = mapx.begin(); d != mapx.end(); mapx.next(d))
Thomas's avatar
Thomas committed
345
	{
346
		if (good(d))
347 348 349 350
			m_nbDarts++;
	}

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


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

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

371 372

	std::vector<Dart> vecDartFaces;
Sylvain Thery's avatar
Sylvain Thery committed
373
	vecDartFaces.reserve(m_nbDarts/6);
374 375 376
	unsigned int posDBI=0;

	//traverse each face of each volume
Sylvain Thery's avatar
Sylvain Thery committed
377
	TraversorCell<typename PFP::MAP> traFace(mapx, PFP::MAP::ORBIT_IN_PARENT(FACE),good);
378
	for (Dart d=traFace.begin(); d!=traFace.end(); d=traFace.next())
379
	{
380 381 382 383 384 385 386 387 388 389 390 391
		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
392
		{
393 394 395 396
			VEC3 P = positions[dd];
			P  = vc*okv + P*kv;
			vecPos.push_back(P);
			centerFace += P;
Sylvain Thery's avatar
Sylvain Thery committed
397
			dd = mapx.phi1(dd);
398 399
		} while (dd != d);
		centerFace /= REAL(vecPos.size());
400

401 402
		//shrink the face
		unsigned int nb = vecPos.size();
403

404
		float okf = 1.0f - kf;
405

406 407 408 409 410
		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
411

412 413 414 415 416 417
		// 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;
418

419 420
			VEC3 PP = 0.52f*P + 0.48f*Q;
			VEC3 QQ = 0.52f*Q + 0.48f*P;
421

422 423 424 425
			*positionDartBuf++ = P;
			*positionDartBuf++ = PP;
			*positionDartBuf++ = Q;
			*positionDartBuf++ = QQ;
426 427 428 429
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
430

431 432
			m_attIndex[d] = posDBI;
			posDBI+=2;
433 434


435 436 437 438 439 440 441
			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;
442

443 444
			m_attIndex[dx] = posDBI;
			posDBI+=2;
445

Sylvain Thery's avatar
Sylvain Thery committed
446
			d = mapx.phi1(d);		}
447 448 449 450 451
	}

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

452 453 454 455
	m_vbo4->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);

	// beta3
456
	m_vbo1->bind();
457
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(typename PFP::VEC3), 0, GL_STREAM_DRAW);
458 459
	GLvoid* PositionBuffer1 = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

460
	// beta3
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 507 508 509 510
	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);
511
			if (!map.isBoundaryMarked(e) && (d < e))
512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
			{
				*positionF3++ = fv2[d];
				*positionF3++ = fv2x[e];
				*positionF3++ = fv2[e];
				*positionF3++ = fv2x[d];
				m_nbRel3++;
			}
			*positionF1++ = fv1[d];
			d = map.beta1(d);
			*positionF1++ = fv1[d];
		} 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
537

538

539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559

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
560 561 562 563 564 565 566
}//end namespace VBO

}//end namespace Algo

}//end namespace Render

}//end namespace CGoGN