Program Listing for File Shader.cpp

Return to documentation for file (gui/Demeter/Renderer/Shader.cpp)

#include <array>
#include <fstream>

#include "Shader.hpp"
#include "logging/Logger.hpp"

bool Shader::Init(const std::string &path)
{
  std::ifstream file(path);
  if (!file) {
    Log::failed << "Failed to open shader file: " << path;
    return false;
  }
  std::string data(
    (std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
  const char *src = data.c_str();
  file.close();

  _shader = glCreateShader(_type);
  glShaderSource(_shader, 1, &src, nullptr);
  glCompileShader(_shader);
  GLint success;
  glGetShaderiv(_shader, GL_COMPILE_STATUS, &success);
  if (!success) {
    std::array<char, 512> log;
    glGetShaderInfoLog(_shader, log.size(), nullptr, log.data());
    Log::failed << "Shader Compile Error: " << log.data();
    return false;
  }
  return true;
}

Shader::~Shader()
{
  glDeleteShader(_shader);
}

bool ShaderProgram::Init(
  std::unique_ptr<VertexShader> vertexShader,
  std::unique_ptr<FragmentShader> fragmentShader)
{
  vs = std::move(vertexShader);
  fs = std::move(fragmentShader);
  program = glCreateProgram();
  glAttachShader(program, vs->Get());
  glAttachShader(program, fs->Get());
  glLinkProgram(program);
  GLint success = 0;
  glGetProgramiv(program, GL_LINK_STATUS, &success);
  if (!success) {
    std::array<char, 512> log;
    glGetProgramInfoLog(program, log.size(), nullptr, log.data());
    Log::failed << "Shader Program Link Error: " << log.data();
    return false;
  }
  return true;
}

ShaderProgram::~ShaderProgram()
{
  glDeleteProgram(program);
}