protot/src/modules/RenderUtils.cc

148 lines
4.3 KiB
C++
Raw Normal View History

2016-08-29 22:31:11 +02:00
#include <string.h> // strlen
#include <locale.h>
#include <iostream>
2018-02-13 12:05:07 +01:00
#include <fstream>
2016-08-29 22:31:11 +02:00
#include "RenderModule.h"
2016-08-29 22:31:11 +02:00
#include "RenderUtils.h"
2017-02-05 10:36:37 +01:00
#include "Globals.h"
using namespace SimpleMath;
2016-08-29 22:31:11 +02:00
//
// RenderProgram
//
2018-02-13 12:05:07 +01:00
RenderProgram::~RenderProgram() {
if (mProgramId > 0)
glDeleteProgram(mProgramId);
2016-08-29 22:31:11 +02:00
}
2018-02-13 12:05:07 +01:00
bool RenderProgram::Load() {
// Create the shaders
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
2016-08-29 22:31:11 +02:00
2018-02-13 12:05:07 +01:00
// Read the Vertex Shader code from the file
std::string VertexShaderCode;
std::ifstream VertexShaderStream(mVertexShaderFilename.c_str(), std::ios::in);
if(VertexShaderStream.is_open()){
std::stringstream sstr;
sstr << VertexShaderStream.rdbuf();
VertexShaderCode = sstr.str();
VertexShaderStream.close();
}else{
gLog("Impossible to open %s. Are you in the right directory ? Don't forget to read the FAQ !\n", mVertexShaderFilename.c_str());
getchar();
return false;
2016-08-29 22:31:11 +02:00
}
2018-02-13 12:05:07 +01:00
// Read the Fragment Shader code from the file
std::string FragmentShaderCode;
std::ifstream FragmentShaderStream(mFragmentShaderFilename.c_str(), std::ios::in);
if(FragmentShaderStream.is_open()){
std::stringstream sstr;
sstr << FragmentShaderStream.rdbuf();
FragmentShaderCode = sstr.str();
FragmentShaderStream.close();
2016-08-29 22:31:11 +02:00
}
2018-02-13 12:05:07 +01:00
GLint Result = GL_FALSE;
int InfoLogLength;
2016-08-29 22:31:11 +02:00
2018-02-13 12:05:07 +01:00
// Compile Vertex Shader
gLog("Compiling shader : %s\n", mVertexShaderFilename.c_str());
char const * VertexSourcePointer = VertexShaderCode.c_str();
glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
glCompileShader(VertexShaderID);
2016-08-29 22:31:11 +02:00
2018-02-13 12:05:07 +01:00
// Check Vertex Shader
glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> VertexShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
gLog("%s\n", &VertexShaderErrorMessage[0]);
}
2018-02-13 12:05:07 +01:00
// Compile Fragment Shader
gLog("Compiling shader : %s\n", mFragmentShaderFilename.c_str());
char const * FragmentSourcePointer = FragmentShaderCode.c_str();
glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
glCompileShader(FragmentShaderID);
2018-02-13 12:05:07 +01:00
// Check Fragment Shader
glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
gLog("%s\n", &FragmentShaderErrorMessage[0]);
}
2018-02-13 12:05:07 +01:00
// Link the program
gLog("Linking program\n");
GLuint ProgramID = glCreateProgram();
glAttachShader(ProgramID, VertexShaderID);
glAttachShader(ProgramID, FragmentShaderID);
glLinkProgram(ProgramID);
2018-02-13 12:05:07 +01:00
// Check the program
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> ProgramErrorMessage(InfoLogLength+1);
glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
gLog("%s\n", &ProgramErrorMessage[0]);
}
2018-02-13 12:05:07 +01:00
glDetachShader(ProgramID, VertexShaderID);
glDetachShader(ProgramID, FragmentShaderID);
2018-02-13 12:05:07 +01:00
glDeleteShader(VertexShaderID);
glDeleteShader(FragmentShaderID);
2018-02-13 12:05:07 +01:00
mProgramId = ProgramID;
return true;
}
//
// RenderTarget
//
RenderTarget::RenderTarget(int width, int height, int flags) {
glGenFramebuffers(1, &mFrameBufferId);
glBindFramebuffer(GL_FRAMEBUFFER, mFrameBufferId);
if (flags & EnableColor) {
glGenTextures(1, &mColorTexture);
glBindTexture(GL_TEXTURE_2D, mColorTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mColorTexture, 0);
}
if (flags & EnableDepth) {
glGenRenderbuffers(1, &mDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, mDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepthBuffer);
}
}
RenderTarget::~RenderTarget() {
// TODO: cleanup
}