Blame c++/contourgl/shaders.cpp

Ivan Mahonin 7c6b57
/*
Ivan Mahonin 7c6b57
    ......... 2015 Ivan Mahonin
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
    This program is free software: you can redistribute it and/or modify
Ivan Mahonin 7c6b57
    it under the terms of the GNU General Public License as published by
Ivan Mahonin 7c6b57
    the Free Software Foundation, either version 3 of the License, or
Ivan Mahonin 7c6b57
    (at your option) any later version.
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
    This program is distributed in the hope that it will be useful,
Ivan Mahonin 7c6b57
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Ivan Mahonin 7c6b57
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Ivan Mahonin 7c6b57
    GNU General Public License for more details.
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
    You should have received a copy of the GNU General Public License
Ivan Mahonin 7c6b57
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Ivan Mahonin 7c6b57
*/
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
#include <cassert>
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
#include <iostream>
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
#include "shaders.h"
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
using namespace std;
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
Shaders::Shaders():
Ivan Mahonin 7c6b57
	simple_vertex_id(),
Ivan Mahonin 7c6b57
	simpleProgramId(),
Ivan Mahonin 7c6b57
	color_fragment_id(),
Ivan Mahonin 7c6b57
	colorProgramId(),
Ivan Mahonin 7c6b57
	colorUniform()
Ivan Mahonin 7c6b57
{
Ivan Mahonin 7c6b57
	// simple
Ivan Mahonin 7c6b57
	const char *simpleVertexSource =
Ivan Mahonin 7c6b57
		"in vec2 position;\n"
Ivan Mahonin 7c6b57
		"void main() { gl_Position = vec4(position, 0.0, 1.0); }\n";
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
	simple_vertex_id = glCreateShader(GL_VERTEX_SHADER);
Ivan Mahonin 7c6b57
	glShaderSource(simple_vertex_id, 1, &simpleVertexSource, NULL);
Ivan Mahonin 7c6b57
	glCompileShader(simple_vertex_id);
Ivan Mahonin 7c6b57
	check_shader(simple_vertex_id, simpleVertexSource);
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
	simpleProgramId = glCreateProgram();
Ivan Mahonin 7c6b57
	glAttachShader(simpleProgramId, simple_vertex_id);
Ivan Mahonin 7c6b57
	glBindAttribLocation(simpleProgramId, 0, "position");
Ivan Mahonin 7c6b57
	glLinkProgram(simpleProgramId);
Ivan Mahonin 7c6b57
	check_program(simpleProgramId, "simple");
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
	// color
Ivan Mahonin 7c6b57
	const char *colorFragmentSource =
Ivan Mahonin 7c6b57
		"uniform vec4 color;\n"
Ivan Mahonin 7c6b57
		//"out vec4 colorOut;\n"
Ivan Mahonin 7c6b57
		"void main() { gl_FragColor = color; }\n";
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
	color_fragment_id = glCreateShader(GL_FRAGMENT_SHADER);
Ivan Mahonin 7c6b57
	glShaderSource(color_fragment_id, 1, &colorFragmentSource, NULL);
Ivan Mahonin 7c6b57
	glCompileShader(color_fragment_id);
Ivan Mahonin 7c6b57
	check_shader(color_fragment_id, colorFragmentSource);
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
	colorProgramId = glCreateProgram();
Ivan Mahonin 7c6b57
	glAttachShader(colorProgramId, simple_vertex_id);
Ivan Mahonin 7c6b57
	glAttachShader(colorProgramId, color_fragment_id);
Ivan Mahonin 7c6b57
	glBindAttribLocation(colorProgramId, 0, "position");
Ivan Mahonin 7c6b57
	//glBindFragDataLocation(color_program_id, 0, "colorOut");
Ivan Mahonin 7c6b57
	glLinkProgram(colorProgramId);
Ivan Mahonin 7c6b57
	check_program(colorProgramId, "color");
Ivan Mahonin 7c6b57
	colorUniform = glGetUniformLocation(colorProgramId, "color");
Ivan Mahonin 7c6b57
}
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
Shaders::~Shaders() {
Ivan Mahonin 7c6b57
	glUseProgram(0);
Ivan Mahonin 7c6b57
	glDeleteProgram(colorProgramId);
Ivan Mahonin 7c6b57
	glDeleteProgram(simpleProgramId);
Ivan Mahonin 7c6b57
	glDeleteShader(color_fragment_id);
Ivan Mahonin 7c6b57
	glDeleteShader(simple_vertex_id);
Ivan Mahonin 7c6b57
}
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
void Shaders::check_shader(GLuint id, const char *src) {
Ivan Mahonin 7c6b57
	GLint compileStatus = 0;
Ivan Mahonin 7c6b57
	glGetShaderiv(id, GL_COMPILE_STATUS, &compileStatus);
Ivan Mahonin 7c6b57
	if (!compileStatus) {
Ivan Mahonin 7c6b57
		GLint infoLogLength = 0;
Ivan Mahonin 7c6b57
		glGetShaderiv(id, GL_INFO_LOG_LENGTH, &infoLogLength);
Ivan Mahonin 7c6b57
		std::string infoLog;
Ivan Mahonin 7c6b57
		infoLog.resize(infoLogLength);
Ivan Mahonin 7c6b57
		glGetShaderInfoLog(id, infoLog.size(), &infoLogLength, &infoLog[0]);
Ivan Mahonin 7c6b57
		infoLog.resize(infoLogLength);
Ivan Mahonin 7c6b57
		cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << "cannot compile shader:" << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~source~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << src << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~log~~~~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << infoLog << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
Ivan Mahonin 7c6b57
	}
Ivan Mahonin 7c6b57
}
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
void Shaders::check_program(GLuint id, const char *name) {
Ivan Mahonin 7c6b57
 	GLint linkStatus = 0;
Ivan Mahonin 7c6b57
	glGetProgramiv(id, GL_LINK_STATUS, &linkStatus);
Ivan Mahonin 7c6b57
	if (!linkStatus) {
Ivan Mahonin 7c6b57
		GLint infoLogLength = 0;
Ivan Mahonin 7c6b57
		glGetProgramiv(id, GL_INFO_LOG_LENGTH, &infoLogLength);
Ivan Mahonin 7c6b57
		std::string infoLog;
Ivan Mahonin 7c6b57
		infoLog.resize(infoLogLength);
Ivan Mahonin 7c6b57
		glGetProgramInfoLog(id, infoLog.size(), &infoLogLength, &infoLog[0]);
Ivan Mahonin 7c6b57
		infoLog.resize(infoLogLength);
Ivan Mahonin 7c6b57
		cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << "cannot link program " << name <<  ":" << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~name~~~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << name << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~log~~~~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << infoLog << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
Ivan Mahonin 7c6b57
	}
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
	glValidateProgram(id);
Ivan Mahonin 7c6b57
	GLint validateStatus = 0;
Ivan Mahonin 7c6b57
	glGetProgramiv(id, GL_VALIDATE_STATUS, &validateStatus);
Ivan Mahonin 7c6b57
	if (!validateStatus) {
Ivan Mahonin 7c6b57
		GLint infoLogLength = 0;
Ivan Mahonin 7c6b57
		glGetProgramiv(id, GL_INFO_LOG_LENGTH, &infoLogLength);
Ivan Mahonin 7c6b57
		std::string infoLog;
Ivan Mahonin 7c6b57
		infoLog.resize(infoLogLength);
Ivan Mahonin 7c6b57
		glGetProgramInfoLog(id, infoLog.size(), &infoLogLength, &infoLog[0]);
Ivan Mahonin 7c6b57
		infoLog.resize(infoLogLength);
Ivan Mahonin 7c6b57
		cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << "program not validated " << name <<  ":" << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~name~~~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << name << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~log~~~~~~~~~~~~~~~~~~" << endl
Ivan Mahonin 7c6b57
			 << infoLog << endl
Ivan Mahonin 7c6b57
			 << "~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
Ivan Mahonin 7c6b57
	}
Ivan Mahonin 7c6b57
}
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
void Shaders::simple() {
Ivan Mahonin 49e693
	glUseProgram(simpleProgramId);
Ivan Mahonin 7c6b57
}
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
void Shaders::color(const Color &c) {
Ivan Mahonin 49e693
	glUseProgram(colorProgramId);
Ivan Mahonin 49e693
	glUniform4fv(colorUniform, 1, c.channels);
Ivan Mahonin 7c6b57
}
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57