topo3Render.hpp 14.3 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 67 68
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;

Sylvain Thery's avatar
Sylvain Thery committed
69
//	Map3& map = dynamic_cast<Map3&>(mapx);
70

Pierre Kraemer's avatar
Pierre Kraemer committed
71 72 73 74
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;


Sylvain Thery's avatar
Sylvain Thery committed
75
	if (m_attIndex.map() != &mapx)
Pierre Kraemer's avatar
Pierre Kraemer committed
76
	{
Sylvain Thery's avatar
Sylvain Thery committed
77
		m_attIndex  = mapx.template getAttribute<unsigned int>(DART, "dart_index");
Sylvain Thery's avatar
Sylvain Thery committed
78
		if (!m_attIndex.isValid())
Sylvain Thery's avatar
Sylvain Thery committed
79
			m_attIndex  = mapx.template addAttribute<unsigned int>(DART, "dart_index");
Pierre Kraemer's avatar
Pierre Kraemer committed
80 81 82
	}

	m_nbDarts = 0;
Sylvain Thery's avatar
Sylvain Thery committed
83
	for (Dart d = mapx.begin(); d != mapx.end(); mapx.next(d))
Pierre Kraemer's avatar
Pierre Kraemer committed
84 85
	{
		if (good(d))
86 87 88 89
			m_nbDarts++;
	}

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

Sylvain Thery's avatar
Sylvain Thery committed
93 94
	Algo::Geometry::computeCentroidVolumes<PFP>(mapx,positions,centerVolumes,good);

Pierre Kraemer's avatar
Pierre Kraemer committed
95 96

	// debut phi1
Sylvain Thery's avatar
Sylvain Thery committed
97
	AutoAttributeHandler<VEC3> fv1(mapx, DART);
Pierre Kraemer's avatar
Pierre Kraemer committed
98
	// fin phi1
Sylvain Thery's avatar
Sylvain Thery committed
99
	AutoAttributeHandler<VEC3> fv11(mapx, DART);
Pierre Kraemer's avatar
Pierre Kraemer committed
100 101

	// phi2
Sylvain Thery's avatar
Sylvain Thery committed
102 103
	AutoAttributeHandler<VEC3> fv2(mapx, DART);
	AutoAttributeHandler<VEC3> fv2x(mapx, DART);
Pierre Kraemer's avatar
Pierre Kraemer committed
104

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

110 111 112
	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
113 114 115
	VEC3* positionDartBuf = reinterpret_cast<VEC3*>(PositionDartsBuffer);


116
	std::vector<Dart> vecDartFaces;
Sylvain Thery's avatar
Sylvain Thery committed
117
	vecDartFaces.reserve(m_nbDarts/3);
118
	unsigned int posDBI=0;
Pierre Kraemer's avatar
Pierre Kraemer committed
119

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

145 146
		//shrink the face
		unsigned int nb = vecPos.size();
Pierre Kraemer's avatar
Pierre Kraemer committed
147

148
		float okf = 1.0f - kf;
Pierre Kraemer's avatar
Pierre Kraemer committed
149

150 151 152 153 154
		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
155

156 157 158 159 160 161
		// 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;
162

163 164
			m_attIndex[d] = posDBI;
			posDBI+=2;
Pierre Kraemer's avatar
Pierre Kraemer committed
165

166 167
			*positionDartBuf++ = P;
			*positionDartBuf++ = Q;
168 169
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
Pierre Kraemer's avatar
Pierre Kraemer committed
170

171 172
			fv1[d] = P*0.1f + Q*0.9f;
			fv11[d] = P*0.9f + Q*0.1f;
Pierre Kraemer's avatar
Pierre Kraemer committed
173

174 175
			fv2[d] = P*0.52f + Q*0.48f;
			fv2x[d] = P*0.48f + Q*0.52f;
Pierre Kraemer's avatar
Pierre Kraemer committed
176

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

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

184 185 186
	m_vbo4->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);

Pierre Kraemer's avatar
Pierre Kraemer committed
187
	// phi1
188 189
	m_vbo1->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(typename PFP::VEC3), 0, GL_STREAM_DRAW);
Pierre Kraemer's avatar
Pierre Kraemer committed
190 191 192
	GLvoid* PositionBuffer1 = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

	//phi2
193 194
	m_vbo2->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(typename PFP::VEC3), 0, GL_STREAM_DRAW);
Pierre Kraemer's avatar
Pierre Kraemer committed
195 196 197
	GLvoid* PositionBuffer2 = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

	//phi3
198 199
	m_vbo3->bind();
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(typename PFP::VEC3), 0, GL_STREAM_DRAW);
Pierre Kraemer's avatar
Pierre Kraemer committed
200 201 202 203 204 205 206 207 208 209 210 211 212 213
	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
		{
Sylvain Thery's avatar
Sylvain Thery committed
214
			Dart e = mapx.phi2(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
215 216 217 218 219 220 221 222
			if (d < e)
			{
				*positionF2++ = fv2[d];
				*positionF2++ = fv2x[e];
				*positionF2++ = fv2[e];
				*positionF2++ = fv2x[d];
				m_nbRel2++;
			}
Sylvain Thery's avatar
Sylvain Thery committed
223 224
			e = mapx.phi3(d);
			if (!mapx.isBoundaryMarked(e) && (d < e))
Pierre Kraemer's avatar
Pierre Kraemer committed
225 226 227 228 229 230 231
			{
				*positionF3++ = fv2[d];
				*positionF3++ = fv2x[e];
				*positionF3++ = fv2[e];
				*positionF3++ = fv2x[d];
				m_nbRel3++;
			}
Sylvain Thery's avatar
Sylvain Thery committed
232
			e = mapx.phi1(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
233 234 235
			*positionF1++ = fv1[d];
			*positionF1++ = fv11[e];

Sylvain Thery's avatar
Sylvain Thery committed
236
			d = mapx.phi1(d);
Pierre Kraemer's avatar
Pierre Kraemer committed
237 238 239
		} while (d != *face );
	}

240 241
	m_vbo3->bind();
	glUnmapBufferARB(GL_ARRAY_BUFFER);
Pierre Kraemer's avatar
Pierre Kraemer committed
242

243 244
	m_vbo2->bind();
	glUnmapBufferARB(GL_ARRAY_BUFFER);
Pierre Kraemer's avatar
Pierre Kraemer committed
245

246 247
	m_vbo1->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);
Pierre Kraemer's avatar
Pierre Kraemer committed
248

249 250
	m_vbo4->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);
Pierre Kraemer's avatar
Pierre Kraemer committed
251
}
Sylvain Thery's avatar
Sylvain Thery committed
252

253 254


255
template<typename PFP>
256
void Topo3Render::setDartsIdColor(typename PFP::MAP& map, const FunctorSelect& good)
257
{
258 259
	m_vbo4->bind();
	float* colorBuffer =  reinterpret_cast<float*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));
260 261 262 263
	unsigned int nb=0;

	for (Dart d = map.begin(); d != map.end(); map.next(d))
	{
264
		if (good(d))
265
		{
266
			if (nb < m_nbDarts)
267
			{
Sylvain Thery's avatar
Sylvain Thery committed
268
				float r,g,b;
269
				dartToCol(d, r,g,b);
270
				
Sylvain Thery's avatar
Sylvain Thery committed
271 272 273 274 275 276 277
				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;
278 279 280

				nb++;
			}
281 282 283
			else
			{
				CGoGNerr << "Error buffer too small for color picking (change the good parameter ?)" << CGoGNendl;
284
				break;
285
			}
286 287
		}
	}
288
	glUnmapBuffer(GL_ARRAY_BUFFER);
289 290
}

Sylvain Thery's avatar
Sylvain Thery committed
291
template<typename PFP>
292
Dart Topo3Render::picking(typename PFP::MAP& map, int x, int y, const FunctorSelect& good)
Sylvain Thery's avatar
Sylvain Thery committed
293 294 295 296 297 298 299 300
{
	pushColors();
	setDartsIdColor<PFP>(map,good);
	Dart d = pickColor(x,y);
	popColors();
	return d;
}

301 302


Thomas's avatar
Thomas committed
303
template<typename PFP>
304
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
305
{
306 307 308
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;

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

Thomas's avatar
Thomas committed
311 312 313 314
	typedef typename PFP::VEC3 VEC3;
	typedef typename PFP::REAL REAL;


Sylvain Thery's avatar
Sylvain Thery committed
315
	if (m_attIndex.map() != &mapx)
Thomas's avatar
Thomas committed
316
	{
Sylvain Thery's avatar
Sylvain Thery committed
317
		m_attIndex  = mapx.template getAttribute<unsigned int>(DART, "dart_index");
Sylvain Thery's avatar
Sylvain Thery committed
318
		if (!m_attIndex.isValid())
Sylvain Thery's avatar
Sylvain Thery committed
319
			m_attIndex  = mapx.template addAttribute<unsigned int>(DART, "dart_index");
Thomas's avatar
Thomas committed
320 321 322
	}

	m_nbDarts = 0;
Sylvain Thery's avatar
Sylvain Thery committed
323
	for (Dart d = mapx.begin(); d != mapx.end(); mapx.next(d))
Thomas's avatar
Thomas committed
324
	{
325
		if (good(d))
326 327 328 329
			m_nbDarts++;
	}

	// compute center of each volumes
Sylvain Thery's avatar
Sylvain Thery committed
330
	AutoAttributeHandler<VEC3> centerVolumes(mapx,VOLUME,"centerVolumes");
Sylvain Thery's avatar
Sylvain Thery committed
331
	Algo::Geometry::computeCentroidVolumes<PFP>(mapx,positions,centerVolumes,good);
332 333 334


	// beta1
Sylvain Thery's avatar
Sylvain Thery committed
335
	AutoAttributeHandler<VEC3> fv1(mapx, DART);
336
	// beta2/3
Sylvain Thery's avatar
Sylvain Thery committed
337 338
	AutoAttributeHandler<VEC3> fv2(mapx, DART);
	AutoAttributeHandler<VEC3> fv2x(mapx, DART);
339 340 341 342 343 344 345 346 347 348 349

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

350 351

	std::vector<Dart> vecDartFaces;
Sylvain Thery's avatar
Sylvain Thery committed
352
	vecDartFaces.reserve(m_nbDarts/6);
353 354 355
	unsigned int posDBI=0;

	//traverse each face of each volume
Sylvain Thery's avatar
Sylvain Thery committed
356
	TraversorCell<typename PFP::MAP> traFace(mapx, PFP::MAP::ORBIT_IN_PARENT(FACE),good);
357
	for (Dart d=traFace.begin(); d!=traFace.end(); d=traFace.next())
358
	{
359 360 361 362 363 364 365 366 367 368 369 370
		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
371
		{
372 373 374 375
			VEC3 P = positions[dd];
			P  = vc*okv + P*kv;
			vecPos.push_back(P);
			centerFace += P;
Sylvain Thery's avatar
Sylvain Thery committed
376
			dd = mapx.phi1(dd);
377 378
		} while (dd != d);
		centerFace /= REAL(vecPos.size());
379

380 381
		//shrink the face
		unsigned int nb = vecPos.size();
382

383
		float okf = 1.0f - kf;
384

385 386 387 388 389
		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
390

391 392 393 394 395 396
		// 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;
397

398 399
			VEC3 PP = 0.52f*P + 0.48f*Q;
			VEC3 QQ = 0.52f*Q + 0.48f*P;
400

401 402 403 404
			*positionDartBuf++ = P;
			*positionDartBuf++ = PP;
			*positionDartBuf++ = Q;
			*positionDartBuf++ = QQ;
405 406 407 408
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
			*colorDartBuf++ = m_dartsColor;
409

410 411
			m_attIndex[d] = posDBI;
			posDBI+=2;
412 413


414 415 416 417 418 419 420
			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;
421

422 423
			m_attIndex[dx] = posDBI;
			posDBI+=2;
424

Sylvain Thery's avatar
Sylvain Thery committed
425
			d = mapx.phi1(d);		}
426 427 428 429 430
	}

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

431 432 433 434
	m_vbo4->bind();
	glUnmapBuffer(GL_ARRAY_BUFFER);

	// beta3
435
	m_vbo1->bind();
436
	glBufferData(GL_ARRAY_BUFFER, 2*m_nbDarts*sizeof(typename PFP::VEC3), 0, GL_STREAM_DRAW);
437 438
	GLvoid* PositionBuffer1 = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

439
	// beta3
440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 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
	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);
490
			if (!map.isBoundaryMarked(e) && (d < e))
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
			{
				*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
516

517

518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538

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
539 540 541 542 543 544 545
}//end namespace VBO

}//end namespace Algo

}//end namespace Render

}//end namespace CGoGN