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

text3d.cpp 7.07 KB
Newer Older
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           *
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/                                         *
21
22
23
24
25
26
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#include "Utils/text3d.h"

27
28
#include "Utils/vbo.h"

29
30
namespace CGoGN
{
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
31

32
33
namespace Utils
{
34
35
36
#include "text3d.vert"
#include "text3d.frag"

37
38
39
40
41

std::string Strings3D::fragmentShaderText2 =
"	gl_FragColor = vec4(color,0.0)*lum;\n"
"}";

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
42

43
44
GLuint Strings3D::m_idTexture = 0xffffffff;

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
45
46

Strings3D::Strings3D(bool withBackground, const Geom::Vec3f& bgc) : m_nbChars(0)
47
{
48
49
	if (m_idTexture == 0xffffffff)
	{
Sylvain Thery's avatar
Sylvain Thery committed
50
		std::string font_filename = Utils::GLSLShader::findFile("font_cgogn.gz");
51
52
53
54
55

		igzstream fs(font_filename.c_str(), std::ios::in|std::ios::binary);
		char* buff = new char[WIDTHTEXTURE*HEIGHTTEXTURE];
		fs.read(reinterpret_cast<char*>(buff), WIDTHTEXTURE*HEIGHTTEXTURE );
		fs.close();
Sylvain Thery's avatar
Sylvain Thery committed
56
		
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
57
		glGenTextures(1, &m_idTexture);
58
		glBindTexture(GL_TEXTURE_2D, m_idTexture);
59
		glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, WIDTHTEXTURE, HEIGHTTEXTURE, 0, GL_LUMINANCE,  GL_UNSIGNED_BYTE, (GLvoid*)(buff));
60
61
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
62
		delete[] buff;
63
	}
64

65
66
67
68
69
70
71
72
	std::string glxvert(*GLSLShader::DEFINES_GL);
	glxvert.append(vertexShaderText);
	std::string glxfrag(*GLSLShader::DEFINES_GL);

	glxfrag.append(fragmentShaderText1);

	std::string background;
	if (!withBackground)
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
73
		glxfrag.append("if (lum == 0.0) discard;\n");
74
75
76
77
	else if (bgc*bgc > 0.0)
	{
		std::stringstream ss;
		ss << "	if (lum==0.0) gl_FragColor=vec4(";
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
78
		ss << bgc[0] << "," << bgc[1] << "," << bgc[2] << ",0.0);\n		else\n";
79
80
81
82
83
84
		background.append(ss.str());
	}
	glxfrag.append(background);
	glxfrag.append(fragmentShaderText2);

	loadShadersFromMemory(glxvert.c_str(), glxfrag.c_str());
85

86
87
88
89
90
91
	m_vbo1 = new Utils::VBO();
	m_vbo1->setDataSize(4);

	bindVA_VBO("VertexPosition", m_vbo1);

	bind();
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
92
93
94
95
	m_uniform_position = glGetUniformLocation(program_handler(), "strPos");
	m_uniform_color = glGetUniformLocation(program_handler(), "color");
	m_uniform_scale = glGetUniformLocation(program_handler(), "scale");
	m_uniform_texture = glGetUniformLocation(program_handler(), "FontTexture");
96
97
98
	glUniform1f(m_uniform_scale, 1.0f);
	unbind();
}
99
100
101

void Strings3D::setScale(float scale)
{
102
	bind();
103
	glUniform1f(m_uniform_scale, scale);
104
	unbind();
105
106
107
108
109
110
}

Strings3D::~Strings3D()
{
}

Sylvain Thery's avatar
Sylvain Thery committed
111
112
113
114
115
116
117
118
void Strings3D::clear()
{
	m_nbChars=0;
	m_strings.clear();
	m_strTranslate.clear();
	m_strpos.clear();
}

119
120
unsigned int Strings3D::addString(const std::string& str)
{
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
121
	unsigned int id = m_strings.size();
122
123
124
125
126
127
128
	m_strings.push_back(str);
	m_nbChars += str.length();
	return id;
}

unsigned int Strings3D::addString(const std::string& str, const Geom::Vec3f& pos)
{
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
129
	unsigned int id = m_strings.size();
130
131
132
133
134
135
136
137
138
139
	m_strings.push_back(str);
	m_nbChars += str.length();
	m_strTranslate.push_back(pos);
	return id;
}

unsigned int Strings3D::sendOneStringToVBO(const std::string& str, float **buffervbo)
{
	unsigned int nbc = str.length();

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
140
	float x = 0.0f;
141
142
143

	float* buffer = *buffervbo;

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
144
	for(unsigned int j = 0; j < nbc; ++j)
145
146
	{
		unsigned int ci = str[j]-32;
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
147
148
149
150
		float u  = float(ci % CHARSPERLINE) / float(CHARSPERLINE);
		float v  = float(ci / CHARSPERLINE) / float(CHARSPERCOL) + 1.0f / HEIGHTTEXTURE;
		float u2 = u + float(REALWIDTHFONT) / float(WIDTHTEXTURE);
		float v2 = v + float(WIDTHFONT - 1) / float(HEIGHTTEXTURE);
151
152
153
154
155
156

		*buffer++ = x;
		*buffer++ = 0;
		*buffer++ = u;
		*buffer++ = v2;

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
157
		float xf = x + float(REALWIDTHFONT) / 25.f;
158
159
160
161
162
163
164

		*buffer++ = xf;
		*buffer++ = 0;
		*buffer++ = u2;
		*buffer++ = v2;

		*buffer++ = xf;
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
165
		*buffer++ = float(WIDTHFONT) / 25.f;
166
167
168
169
		*buffer++ = u2;
		*buffer++ = v;

		*buffer++ = x;
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
170
		*buffer++ = float(WIDTHFONT) / 25.f;
171
172
173
174
175
176
177
178
		*buffer++ = u;
		*buffer++ = v;

		x = xf; // + space ?
	}

	*buffervbo = buffer;

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
179
	return 4 * nbc;
180
181
182
183
184
185
186
}

void Strings3D::sendToVBO()
{
	// send coord / texcoord of strings

	// alloc buffer
187
	m_vbo1->bind();
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
188
189
	glBufferData(GL_ARRAY_BUFFER, m_nbChars * 16 * sizeof(float), 0, GL_STREAM_DRAW);
	float* buffer = reinterpret_cast<float*>(glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE));
190
191

	// fill buffer
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
192
	unsigned int pos = 0; // pos of first index in vbo for current string
193
	unsigned int nbw = m_strings.size();
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
194
	for (unsigned int i = 0; i < nbw; ++i)
195
196
	{
		unsigned int nb = sendOneStringToVBO(m_strings[i], &buffer);
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
197
		m_strpos.push_back(std::pair<unsigned int, unsigned int>(pos, nb));
198
199
200
		pos += nb;
	}

201
	glUnmapBuffer(GL_ARRAY_BUFFER);
202
203
204
205
}

void Strings3D::predraw(const Geom::Vec3f& color)
{
206
	bind();
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
207
208
	glUniform1i(m_uniform_texture, 0);
	glUniform3fv(m_uniform_color, 1, color.data());
209
210
211
212
213
214
215

	glActiveTextureARB(GL_TEXTURE0_ARB);
	glBindTexture(GL_TEXTURE_2D, m_idTexture);
	glEnable(GL_TEXTURE_2D);

	glDisable(GL_LIGHTING);

216
	enableVertexAttribs();
217
218
219
220
}

void Strings3D::postdraw()
{
221
222
	disableVertexAttribs();
	unbind();
223
224
225
226
227
228
229
230
231
232
233
234
235
}

void Strings3D::draw(unsigned int idSt, const Geom::Vec3f& pos)
{
	glUniform3fv(m_uniform_position, 1, pos.data());
	glDrawArrays(GL_QUADS, m_strpos[idSt].first , m_strpos[idSt].second );
}

void Strings3D::drawAll(const Geom::Vec3f& color)
{
	predraw(color);
	if (m_strpos.size() != m_strTranslate.size())
	{
236
		CGoGNerr << "Strings3D: for drawAll use exclusively addString with position"<< CGoGNendl;
237
238
239
240
241
242
243
244
245
246
247
248
		return;
	}

	unsigned int nb = m_strpos.size();
	for (unsigned int idSt=0; idSt<nb; ++idSt)
	{
		glUniform3fv(m_uniform_position, 1, m_strTranslate[idSt].data());
		glDrawArrays(GL_QUADS, m_strpos[idSt].first , m_strpos[idSt].second );
	}
	postdraw();
}

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
249
} // namespace Utils
250

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
251
} // namespace CGoGN