topo3Render.cpp 9 KB
Newer Older
Sylvain Thery's avatar
Sylvain Thery committed
1
2
3
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
4
* Copyright (C) 2009-2011, IGG Team, LSIIT, University of Strasbourg           *
Sylvain Thery's avatar
Sylvain Thery 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.u-strasbg.fr/                                         *
Sylvain Thery's avatar
Sylvain Thery committed
21
22
23
24
25
26
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#include "Algo/Render/GL2/topo3Render.h"
#include "Topology/generic/dart.h"
27
28
29
#include "Utils/Shaders/shaderSimpleColor.h"
#include "Utils/Shaders/shaderColorPerVertex.h"

Sylvain Thery's avatar
Sylvain Thery committed
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

#include <string.h>

namespace CGoGN
{

namespace Algo
{

namespace Render
{

namespace GL2
{

45
Topo3Render::Topo3Render():
46
m_nbDarts(0),m_nbRel2(0),m_nbRel3(0),
Sylvain Thery's avatar
Sylvain Thery committed
47
48
m_topo_dart_width(2.0f), m_topo_relation_width(3.0f),m_color_save(NULL)
{
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
	m_vbo0 = new Utils::VBO();
	m_vbo1 = new Utils::VBO();
	m_vbo2 = new Utils::VBO();
	m_vbo3 = new Utils::VBO();
	m_vbo4 = new Utils::VBO();

	m_vbo0->setDataSize(3);
	m_vbo1->setDataSize(3);
	m_vbo2->setDataSize(3);
	m_vbo3->setDataSize(3);
	m_vbo4->setDataSize(3);

	m_shader1 = new Utils::ShaderSimpleColor();
	m_shader2 = new Utils::ShaderColorPerVertex();


	// binding VBO - VA
	m_vaId = m_shader1->setAttributePosition(m_vbo1);

	m_shader2->setAttributePosition(m_vbo0);
	m_shader2->setAttributeColor(m_vbo4);

	// registering for auto matrices update
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
72
73
	Utils::GLSLShader::registerShader(NULL, m_shader1);
	Utils::GLSLShader::registerShader(NULL, m_shader2);
74

Sylvain Thery's avatar
Sylvain Thery committed
75
76
}

77
Topo3Render::~Topo3Render()
Sylvain Thery's avatar
Sylvain Thery committed
78
{
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
79
80
	Utils::GLSLShader::unregisterShader(NULL, m_shader2);
	Utils::GLSLShader::unregisterShader(NULL, m_shader1);
81
82
83
84
85
86
87
88
89

	delete m_shader2;
	delete m_shader1;
	delete m_vbo4;
	delete m_vbo3;
	delete m_vbo2;
	delete m_vbo1;
	delete m_vbo0;

Sylvain Thery's avatar
Sylvain Thery committed
90
91
92
93
94
95
96
97
98
	if (m_attIndex.map() != NULL)
		static_cast<AttribMap*>(m_attIndex.map())->removeAttribute(m_attIndex);

	if (m_color_save!=NULL)
	{
		delete[] m_color_save;
	}
}

99
void Topo3Render::setDartWidth(float dw)
Sylvain Thery's avatar
Sylvain Thery committed
100
101
102
103
{
	m_topo_dart_width = dw;
}

104
void Topo3Render::setRelationWidth(float pw)
Sylvain Thery's avatar
Sylvain Thery committed
105
106
107
108
{
	m_topo_relation_width = pw;
}

109
void Topo3Render::setDartColor(Dart d, float r, float g, float b)
Sylvain Thery's avatar
Sylvain Thery committed
110
111
112
113
{
	float RGB[6];
	RGB[0]=r; RGB[1]=g; RGB[2]=b;
	RGB[3]=r; RGB[4]=g; RGB[5]=b;
114
	m_vbo4->bind();
Sylvain Thery's avatar
Sylvain Thery committed
115
116
117
	glBufferSubData(GL_ARRAY_BUFFER, m_attIndex[d]*3*sizeof(float), 6*sizeof(float),RGB);
}

118
void Topo3Render::setAllDartsColor(float r, float g, float b)
Sylvain Thery's avatar
Sylvain Thery committed
119
{
120
	m_vbo4->bind();
Sylvain Thery's avatar
Sylvain Thery committed
121
122
123
124
125
126
127
128
	GLvoid* ColorDartsBuffer = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);
	float* colorDartBuf = reinterpret_cast<float*>(ColorDartsBuffer);
	for (unsigned int i=0; i < 2*m_nbDarts; ++i)
	{
		*colorDartBuf++ = r;
		*colorDartBuf++ = g;
		*colorDartBuf++ = b;
	}
129
	glUnmapBufferARB(GL_ARRAY_BUFFER);
Sylvain Thery's avatar
Sylvain Thery committed
130
131
132

}

133
void Topo3Render::drawDarts()
Sylvain Thery's avatar
Sylvain Thery committed
134
{
135
136
137
	if (m_nbDarts==0)
		return;

138
	m_shader2->enableVertexAttribs();
Sylvain Thery's avatar
Sylvain Thery committed
139

140
	glLineWidth(m_topo_dart_width);
Sylvain Thery's avatar
Sylvain Thery committed
141
142
	glDrawArrays(GL_LINES, 0, m_nbDarts*2);

143
144
	// change the stride to take 1/2 vertices
	m_shader2->enableVertexAttribs(6*sizeof(GL_FLOAT));
Sylvain Thery's avatar
Sylvain Thery committed
145

146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
	glPointSize(2.0f*m_topo_dart_width);
 	glDrawArrays(GL_POINTS, 0, m_nbDarts);

 	m_shader2->disableVertexAttribs();

//
////	glColor3f(1.0f,1.0f,1.0f);
//	glLineWidth(m_topo_dart_width);
//	glPointSize(2.0f*m_topo_dart_width);
//
//	glBindBufferARB(GL_ARRAY_BUFFER, m_VBOBuffers[4]);
//	glColorPointer(3, GL_FLOAT, 0, 0);
//	glEnableClientState(GL_COLOR_ARRAY);
//
//	glBindBufferARB(GL_ARRAY_BUFFER, m_VBOBuffers[0]);
//	glVertexPointer(3, GL_FLOAT, 0, 0);
//	glEnableClientState(GL_VERTEX_ARRAY);
//	glDrawArrays(GL_LINES, 0, m_nbDarts*2);
//
// 	glVertexPointer(3, GL_FLOAT, 6*sizeof(GL_FLOAT), 0);
//
//	glBindBufferARB(GL_ARRAY_BUFFER, m_VBOBuffers[4]);
// 	glColorPointer(3, GL_FLOAT, 6*sizeof(GL_FLOAT), 0);
// 	glDrawArrays(GL_POINTS, 0, m_nbDarts)
// 	;
//	glDisableClientState(GL_COLOR_ARRAY);
//	glDisableClientState(GL_VERTEX_ARRAY);
Sylvain Thery's avatar
Sylvain Thery committed
173
174
175
176
177

}



178
void Topo3Render::drawRelation1()
Sylvain Thery's avatar
Sylvain Thery committed
179
{
180
181
182
	if (m_nbDarts==0)
		return;

Sylvain Thery's avatar
Sylvain Thery committed
183
184
	glLineWidth(m_topo_relation_width);

185
186
187
188
	m_shader1->changeVA_VBO(m_vaId, m_vbo1);
	m_shader1->setColor(Geom::Vec4f(0.0f,1.0f,1.0f,0.0f));
	m_shader1->enableVertexAttribs();

Sylvain Thery's avatar
Sylvain Thery committed
189
	glDrawArrays(GL_LINES, 0, m_nbDarts*2);
190
191
192
193
194
195
196
197
198
199
200

	m_shader1->disableVertexAttribs();

//	glLineWidth(m_topo_relation_width);
//	glColor3f(0.0f,1.0f,1.0f);
//	glBindBufferARB(GL_ARRAY_BUFFER, m_VBOBuffers[1]);
//	glVertexPointer(3, GL_FLOAT, 0, 0);
//
//	glEnableClientState(GL_VERTEX_ARRAY);
//	glDrawArrays(GL_LINES, 0, m_nbDarts*2);
//	glDisableClientState(GL_VERTEX_ARRAY);
Sylvain Thery's avatar
Sylvain Thery committed
201
202
203
}


204
void Topo3Render::drawRelation2()
Sylvain Thery's avatar
Sylvain Thery committed
205
{
206
207
208
	if (m_nbRel2==0)
		return;

209
210
211
	m_shader1->changeVA_VBO(m_vaId, m_vbo2);
	m_shader1->setColor(Geom::Vec4f(1.0f,0.0f,0.0f,0.0f));
	m_shader1->enableVertexAttribs();
Sylvain Thery's avatar
Sylvain Thery committed
212
213

	glDrawArrays(GL_QUADS, 0, m_nbRel2*4);
214
215
216
217
218
219
220
221
222
223
224

	m_shader1->disableVertexAttribs();

//	glLineWidth(m_topo_relation_width);
//	glColor3f(1.0f,0.0f,0.0f);
//	glBindBufferARB(GL_ARRAY_BUFFER, m_VBOBuffers[2]);
//	glVertexPointer(3, GL_FLOAT, 0, 0);
//
//	glEnableClientState(GL_VERTEX_ARRAY);
//	glDrawArrays(GL_QUADS, 0, m_nbRel2*4);
//	glDisableClientState(GL_VERTEX_ARRAY);
Sylvain Thery's avatar
Sylvain Thery committed
225
226
227
}


228
void Topo3Render::drawRelation3()
Sylvain Thery's avatar
Sylvain Thery committed
229
{
230
231
232
	if (m_nbRel3==0)
		return;

233
234
235
	m_shader1->changeVA_VBO(m_vaId, m_vbo3);
	m_shader1->setColor(Geom::Vec4f(1.0f,1.0f,0.0f,0.0f));
	m_shader1->enableVertexAttribs();
Sylvain Thery's avatar
Sylvain Thery committed
236
237

	glDrawArrays(GL_QUADS, 0, m_nbRel3*4);
238
239
240
241
242
243
244
245
246
247
248

	m_shader1->disableVertexAttribs();

//	glLineWidth(m_topo_relation_width);
//	glColor3f(1.0f,1.0f,0.0f);
//	glBindBufferARB(GL_ARRAY_BUFFER, m_VBOBuffers[3]);
//	glVertexPointer(3, GL_FLOAT, 0, 0);
//
//	glEnableClientState(GL_VERTEX_ARRAY);
//	glDrawArrays(GL_QUADS, 0, m_nbRel3*4);
//	glDisableClientState(GL_VERTEX_ARRAY);
Sylvain Thery's avatar
Sylvain Thery committed
249
250
251
}


252
void Topo3Render::drawTopo()
Sylvain Thery's avatar
Sylvain Thery committed
253
254
255
256
257
258
259
{
	drawDarts();
	drawRelation1();
	drawRelation2();
	drawRelation3();
}

260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281

void Topo3Render::overdrawDart(Dart d, float width, float r, float g, float b)
{
	unsigned int indexDart =  m_attIndex[d];

	m_shader1->changeVA_VBO(m_vaId, m_vbo0);
	m_shader1->setColor(Geom::Vec4f(r,g,b,0.0f));
	m_shader1->enableVertexAttribs();

	glLineWidth(width);
	glDrawArrays(GL_LINES, indexDart, 2);

	glPointSize(2.0f*width);
 	glDrawArrays(GL_POINTS, indexDart, 1);

 	m_shader2->disableVertexAttribs();


}


void Topo3Render::pushColors()
Sylvain Thery's avatar
Sylvain Thery committed
282
283
{
	m_color_save = new float[6*m_nbDarts];
284
	m_vbo4->bind();
Sylvain Thery's avatar
Sylvain Thery committed
285
286
287
288
289
290
291
	void* colorBuffer = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

	memcpy(m_color_save, colorBuffer, 6*m_nbDarts*sizeof(float));
	glUnmapBuffer(GL_ARRAY_BUFFER);
}


292
void Topo3Render::popColors()
Sylvain Thery's avatar
Sylvain Thery committed
293
{
294
	m_vbo4->bind();
Sylvain Thery's avatar
Sylvain Thery committed
295
296
297
298
299
300
301
302
303
304
	void* colorBuffer = glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);

	memcpy(colorBuffer, m_color_save, 6*m_nbDarts*sizeof(float));
	glUnmapBuffer(GL_ARRAY_BUFFER);

	delete[] m_color_save;
	m_color_save=0;
}


305
Dart Topo3Render::colToDart(float* color)
Sylvain Thery's avatar
Sylvain Thery committed
306
307
308
309
310
311
312
{
	unsigned int r = (unsigned int)(color[0]*255.0f);
	unsigned int g = (unsigned int)(color[1]*255.0f);
	unsigned int b = (unsigned int)(color[2]*255.0f);

	unsigned int id = r + 255*g +255*255*b;

313
314
315
	if (id == 0)
		return NIL;
	return Dart(id-1);
Sylvain Thery's avatar
Sylvain Thery committed
316
317
318
}


Sylvain Thery's avatar
Sylvain Thery committed
319
Dart Topo3Render::pickColor(unsigned int x, unsigned int y)
Sylvain Thery's avatar
Sylvain Thery committed
320
321
322
323
324
325
326
327
328
329
330
331
332
333
{
	//more easy picking for
	unsigned int dw = m_topo_dart_width;
	m_topo_dart_width+=2;

	// save clear color and set to zero
	float cc[4];
	glGetFloatv(GL_COLOR_CLEAR_VALUE,cc);

	glClearColor(0.0f,0.0f,0.0f,0.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glDisable(GL_LIGHTING);
	// draw in back buffer (not shown on screen)
Sylvain Thery's avatar
Sylvain Thery committed
334

Sylvain Thery's avatar
Sylvain Thery committed
335
336
337
338
339
340
341
342
343
344
345
	drawDarts();

	// restore dart with
	m_topo_dart_width = dw;

	// read the pixel under the mouse in back buffer
	glReadBuffer(GL_BACK);
	float color[3];
	glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,color);

	glClearColor(cc[0], cc[1], cc[2], cc[3]);
346
347
348
	
	
	std::cout << color[0] << ", "<<color[1] << ", "<<color[2] <<std::endl;
Sylvain Thery's avatar
Sylvain Thery committed
349
350
351
352
353
354
355
356
357
358
359
360
361
	return colToDart(color);
}




}//end namespace GL2

}//end namespace Render

}//end namespace Algo

}//end namespace CGoGN