shaderPhong.cpp 6.64 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-2012, 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.unistra.fr/                                           *
Sylvain Thery's avatar
Sylvain Thery committed
21
22
23
24
25
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#include <GL/glew.h>
26
#include "Utils/Shaders/shaderPhong.h"
Sylvain Thery's avatar
Sylvain Thery committed
27
28
29

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

Sylvain Thery's avatar
Sylvain Thery committed
31
32
namespace Utils
{
33
34
#include "shaderPhong.vert"
#include "shaderPhong.frag"
Sylvain Thery's avatar
Sylvain Thery committed
35
36


Sylvain's avatar
Sylvain committed
37
ShaderPhong::ShaderPhong(bool doubleSided, bool withEyePosition):
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
38
	m_with_color(false),
Sylvain's avatar
Sylvain committed
39
	m_with_eyepos(false),
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
40
41
42
43
	m_ambiant(Geom::Vec4f(0.05f,0.05f,0.1f,0.0f)),
	m_diffuse(Geom::Vec4f(0.1f,1.0f,0.1f,0.0f)),
	m_specular(Geom::Vec4f(1.0f,1.0f,1.0f,0.0f)),
	m_shininess(100.0f),
44
45
46
	m_lightPos(Geom::Vec3f(10.0f,10.0f,1000.0f)),
	m_vboPos(NULL),
	m_vboNormal(NULL),
Sylvain Thery's avatar
Sylvain Thery committed
47
	m_vboColor(NULL)
Sylvain Thery's avatar
Sylvain Thery committed
48
{
49
50
51
52
53

	m_nameVS = "ShaderPhong_vs";
	m_nameFS = "ShaderPhong_fs";
	m_nameGS = "ShaderPhong_gs";

Sylvain Thery's avatar
Sylvain Thery committed
54
55
56
	// get choose GL defines (2 or 3)
	// ans compile shaders
	std::string glxvert(*GLSLShader::DEFINES_GL);
Sylvain's avatar
Sylvain committed
57
58
	if (m_with_eyepos)
		glxvert.append("#define WITH_EYEPOSITION");
Sylvain Thery's avatar
Sylvain Thery committed
59
60
	glxvert.append(vertexShaderText);
	std::string glxfrag(*GLSLShader::DEFINES_GL);
61
62
63
	// Use double sided lighting if set
	if (doubleSided)
		glxfrag.append("#define DOUBLE_SIDED\n");
Sylvain Thery's avatar
Sylvain Thery committed
64
65
66
67
68
69
70
71
72
73
	glxfrag.append(fragmentShaderText);

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

	// and get and fill uniforms
	bind();
	getLocations();
	sendParams();
}

Sylvain Thery's avatar
Sylvain Thery committed
74
void ShaderPhong::getLocations()
Sylvain Thery's avatar
Sylvain Thery committed
75
{
76
77
78
79
80
	*m_unif_ambiant   = glGetUniformLocation(this->program_handler(), "materialAmbient");
	*m_unif_diffuse   = glGetUniformLocation(this->program_handler(), "materialDiffuse");
	*m_unif_specular  = glGetUniformLocation(this->program_handler(), "materialSpecular");
	*m_unif_shininess = glGetUniformLocation(this->program_handler(), "shininess");
	*m_unif_lightPos  = glGetUniformLocation(this->program_handler(), "lightPosition");
Sylvain's avatar
Sylvain committed
81
82
	if (m_with_eyepos)
		*m_unif_eyePos  = glGetUniformLocation(this->program_handler(), "eyePosition");
Sylvain Thery's avatar
Sylvain Thery committed
83
84
}

Sylvain Thery's avatar
Sylvain Thery committed
85
void ShaderPhong::sendParams()
Sylvain Thery's avatar
Sylvain Thery committed
86
{
87
88
89
90
91
	glUniform4fv(*m_unif_ambiant,  1, m_ambiant.data());
	glUniform4fv(*m_unif_diffuse,  1, m_diffuse.data());
	glUniform4fv(*m_unif_specular, 1, m_specular.data());
	glUniform1f(*m_unif_shininess,    m_shininess);
	glUniform3fv(*m_unif_lightPos, 1, m_lightPos.data());
Sylvain's avatar
Sylvain committed
92
93
	if (m_with_eyepos)
		glUniform3fv(*m_unif_eyePos, 1, m_eyePos.data());
Sylvain Thery's avatar
Sylvain Thery committed
94
95
}

Sylvain Thery's avatar
Sylvain Thery committed
96
void ShaderPhong::setAmbiant(const Geom::Vec4f& ambiant)
Sylvain Thery's avatar
Sylvain Thery committed
97
98
{
	this->bind();
99
	glUniform4fv(*m_unif_ambiant,1, ambiant.data());
Sylvain Thery's avatar
Sylvain Thery committed
100
101
102
	m_ambiant = ambiant;
}

Sylvain Thery's avatar
Sylvain Thery committed
103
void ShaderPhong::setDiffuse(const Geom::Vec4f& diffuse)
Sylvain Thery's avatar
Sylvain Thery committed
104
105
{
	this->bind();
106
	glUniform4fv(*m_unif_diffuse,1, diffuse.data());
Sylvain Thery's avatar
Sylvain Thery committed
107
108
109
	m_diffuse = diffuse;
}

Sylvain Thery's avatar
Sylvain Thery committed
110
void ShaderPhong::setSpecular(const Geom::Vec4f& specular)
Sylvain Thery's avatar
Sylvain Thery committed
111
112
{
	this->bind();
113
	glUniform4fv(*m_unif_specular,1,specular.data());
Sylvain Thery's avatar
Sylvain Thery committed
114
115
116
	m_specular = specular;
}

Sylvain Thery's avatar
Sylvain Thery committed
117
void ShaderPhong::setShininess(float shininess)
Sylvain Thery's avatar
Sylvain Thery committed
118
119
{
	this->bind();
120
	glUniform1f (*m_unif_shininess, shininess);
Sylvain Thery's avatar
Sylvain Thery committed
121
122
123
	m_shininess = shininess;
}

Sylvain Thery's avatar
Sylvain Thery committed
124
void ShaderPhong::setLightPosition( Geom::Vec3f lightPos)
Sylvain Thery's avatar
Sylvain Thery committed
125
126
{
	this->bind();
127
	glUniform3fv(*m_unif_lightPos,1,lightPos.data());
Sylvain Thery's avatar
Sylvain Thery committed
128
129
130
	m_lightPos = lightPos;
}

Sylvain's avatar
Sylvain committed
131
132
133
134
135
void ShaderPhong::setEyePosition( Geom::Vec3f eyePos)
{
	if (m_with_eyepos)
	{
		this->bind();
Sylvain Thery's avatar
Sylvain Thery committed
136
		glUniform3fv(*m_unif_eyePos,1,eyePos.data());
Sylvain's avatar
Sylvain committed
137
138
139
140
		m_eyePos = eyePos;
	}
}

Sylvain Thery's avatar
Sylvain Thery committed
141
void ShaderPhong::setParams(const Geom::Vec4f& ambiant, const Geom::Vec4f& diffuse, const Geom::Vec4f& specular, float shininess, const Geom::Vec3f& lightPos)
Sylvain Thery's avatar
Sylvain Thery committed
142
143
144
145
146
147
148
149
150
151
{
	m_ambiant = ambiant;
	m_diffuse = diffuse;
	m_specular = specular;
	m_shininess = shininess;
	m_lightPos = lightPos;
	bind();
	sendParams();
}

152
unsigned int ShaderPhong::setAttributeColor(VBO* vbo)
Sylvain Thery's avatar
Sylvain Thery committed
153
{
154
	m_vboColor = vbo;
Sylvain Thery's avatar
Sylvain Thery committed
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
	if (!m_with_color)
	{
		m_with_color=true;
		// set the define and recompile shader
		std::string gl3vert(*GLSLShader::DEFINES_GL);
		gl3vert.append("#define WITH_COLOR 1\n");
		gl3vert.append(vertexShaderText);
		std::string gl3frag(*GLSLShader::DEFINES_GL);
		gl3frag.append("#define WITH_COLOR 1\n");
		gl3frag.append(fragmentShaderText);
		loadShadersFromMemory(gl3vert.c_str(), gl3frag.c_str());

		// and treat uniforms
		bind();
		getLocations();
		sendParams();
	}
	// bind th VA with WBO
173
	return bindVA_VBO("VertexColor", vbo);
Sylvain Thery's avatar
Sylvain Thery committed
174
175
}

Sylvain Thery's avatar
Sylvain Thery committed
176
void ShaderPhong::unsetAttributeColor()
Sylvain Thery's avatar
Sylvain Thery committed
177
{
178
	m_vboColor = NULL;
Sylvain Thery's avatar
Sylvain Thery committed
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
	if (m_with_color)
	{
		m_with_color=false;
		// unbind the VA
		unbindVA("VertexColor");
		// recompile shader
		std::string gl3vert(*GLSLShader::DEFINES_GL);
		gl3vert.append(vertexShaderText);
		std::string gl3frag(*GLSLShader::DEFINES_GL);
		gl3frag.append(fragmentShaderText);
		loadShadersFromMemory(gl3vert.c_str(), gl3frag.c_str());
		// and treat uniforms
		bind();
		getLocations();
		sendParams();
	}
195
196
197
198
199
}

void ShaderPhong::restoreUniformsAttribs()
{
	getLocations();
200
201

	bind();
202
	sendParams();
Sylvain Thery's avatar
Sylvain Thery committed
203

204
205
206
207
	bindVA_VBO("VertexPosition", m_vboPos);
	bindVA_VBO("VertexNormal", m_vboNormal);
	if (m_vboColor)
		bindVA_VBO("VertexColor", m_vboColor);
208
	unbind();
Sylvain Thery's avatar
Sylvain Thery committed
209
210
}

211
212
unsigned int ShaderPhong::setAttributePosition(VBO* vbo)
{
Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
213
	m_vboPos = vbo;
214
215
216
217
218
219
220
221
222
	return bindVA_VBO("VertexPosition", vbo);
}

unsigned int ShaderPhong::setAttributeNormal(VBO* vbo)
{
	m_vboNormal = vbo;
	return bindVA_VBO("VertexNormal", vbo);
}

Pierre Kraemer's avatar
merge..    
Pierre Kraemer committed
223
} // namespace Utils
224

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