Sloth loves Chunk!
This commit is contained in:
		
							
								
								
									
										155
									
								
								SQCSim2021/shader.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								SQCSim2021/shader.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
			
		||||
#include "shader.h"
 | 
			
		||||
#include "define.h"
 | 
			
		||||
#include "tool.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <cassert>
 | 
			
		||||
 | 
			
		||||
#ifndef WINDOWS
 | 
			
		||||
 | 
			
		||||
bool Shader::Load(const std::string& vertFile, const std::string& fragFile, bool verbose)
 | 
			
		||||
{
 | 
			
		||||
    std::string fragmentShader;
 | 
			
		||||
    std::string vertexShader;
 | 
			
		||||
 | 
			
		||||
    if(!Tool::LoadTextFile(vertFile, vertexShader))
 | 
			
		||||
    {
 | 
			
		||||
        if(verbose)
 | 
			
		||||
            std::cout << "Failed to load " << vertFile << std::endl;
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(!Tool::LoadTextFile(fragFile, fragmentShader))
 | 
			
		||||
    {
 | 
			
		||||
        if(verbose)
 | 
			
		||||
            std::cout << "Failed to load " << fragFile << std::endl;
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const char * my_fragment_shader_source = fragmentShader.c_str();
 | 
			
		||||
    const char * my_vertex_shader_source = vertexShader.c_str();
 | 
			
		||||
 | 
			
		||||
    //std::cout << fragmentShader << std::endl;
 | 
			
		||||
    //std::cout << vertexShader << std::endl;
 | 
			
		||||
 | 
			
		||||
    m_program = glCreateProgram();
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
    assert(glIsProgram(m_program));
 | 
			
		||||
 | 
			
		||||
    m_vertexShader = glCreateShader(GL_VERTEX_SHADER_ARB);
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
    assert(glIsShader(m_vertexShader));
 | 
			
		||||
 | 
			
		||||
    m_fragmentShader = glCreateShader(GL_FRAGMENT_SHADER_ARB);
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
    assert(glIsShader(m_fragmentShader));
 | 
			
		||||
 | 
			
		||||
    // Load Shader Sources
 | 
			
		||||
    glShaderSource(m_vertexShader, 1, (const GLchar**)&my_vertex_shader_source, NULL);
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
    glShaderSource(m_fragmentShader, 1, (const GLchar**)&my_fragment_shader_source, NULL);
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
 | 
			
		||||
    // Compile The Shaders
 | 
			
		||||
    if(verbose)
 | 
			
		||||
        std::cout << "Compiling vertex shader (" << vertFile << ")..." << std::endl;
 | 
			
		||||
    glCompileShader(m_vertexShader);
 | 
			
		||||
    if(!CheckShaderError(m_vertexShader, verbose))
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    if(verbose)
 | 
			
		||||
        std::cout << "Compiling fragment shader (" << fragFile << ")..." << std::endl;
 | 
			
		||||
    glCompileShader(m_fragmentShader);
 | 
			
		||||
    if(!CheckShaderError(m_fragmentShader, verbose))
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    // Attach The Shader Objects To The Program Object
 | 
			
		||||
    glAttachShader(m_program, m_vertexShader);
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
    glAttachShader(m_program, m_fragmentShader);
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
 | 
			
		||||
    // Link The Program Object
 | 
			
		||||
    glLinkProgram(m_program);
 | 
			
		||||
    //if(!CheckProgramError(m_program, verbose))
 | 
			
		||||
    //    return false;
 | 
			
		||||
    CheckProgramError(m_program, true, verbose);
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Shader::Use() const
 | 
			
		||||
{
 | 
			
		||||
    glUseProgram(m_program);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLint Shader::BindIntUniform(const std::string& name) const
 | 
			
		||||
{
 | 
			
		||||
    return glGetUniformLocation(m_program, name.c_str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Shader::UpdateIntUniform(GLint name, GLint value) const
 | 
			
		||||
{
 | 
			
		||||
    glUniform1i(name, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Shader::UpdateFloatUniform(GLint name, GLfloat value) const
 | 
			
		||||
{
 | 
			
		||||
    glUniform1f(name, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Shader::Disable()
 | 
			
		||||
{
 | 
			
		||||
    glUseProgram(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Shader::CheckShaderError(GLenum shader, bool verbose)
 | 
			
		||||
{
 | 
			
		||||
    GLint compileOk;
 | 
			
		||||
 | 
			
		||||
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compileOk);
 | 
			
		||||
    if(verbose && !compileOk)
 | 
			
		||||
    {
 | 
			
		||||
        int maxLength;
 | 
			
		||||
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
 | 
			
		||||
 | 
			
		||||
        char* infoLog = new char[maxLength];
 | 
			
		||||
 | 
			
		||||
        glGetShaderInfoLog(shader, maxLength, &maxLength, infoLog);
 | 
			
		||||
 | 
			
		||||
        std::cout << infoLog << std::endl;
 | 
			
		||||
        delete [] infoLog;
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return compileOk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Shader::CheckProgramError(GLenum program, bool showWarning, bool verbose)
 | 
			
		||||
{
 | 
			
		||||
    GLint compileOk;
 | 
			
		||||
 | 
			
		||||
    glGetProgramiv(program, GL_LINK_STATUS, &compileOk);
 | 
			
		||||
    CHECK_GL_ERROR();
 | 
			
		||||
    if(verbose && (showWarning || !compileOk))
 | 
			
		||||
    {
 | 
			
		||||
        int maxLength;
 | 
			
		||||
        glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
 | 
			
		||||
        CHECK_GL_ERROR();
 | 
			
		||||
 | 
			
		||||
        char* infoLog = new char[maxLength + 1];
 | 
			
		||||
 | 
			
		||||
        glGetProgramInfoLog(program, maxLength, &maxLength, infoLog);
 | 
			
		||||
        CHECK_GL_ERROR();
 | 
			
		||||
 | 
			
		||||
        infoLog[maxLength] = 0;
 | 
			
		||||
 | 
			
		||||
        std::cout << infoLog << std::endl;
 | 
			
		||||
        delete [] infoLog;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return compileOk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user