144 lines
4.7 KiB
C++
144 lines
4.7 KiB
C++
#include <SDL2/SDL.h>
|
|
#include <SDL2/SDL_image.h>
|
|
#include <fstream>
|
|
#include <vector>
|
|
#include "loaders.h"
|
|
|
|
int InitLoaders(){
|
|
return SDL_Init(SDL_INIT_VIDEO);
|
|
}
|
|
|
|
GLuint LoadTexture(char *filename,int *textw,int *texth) {
|
|
SDL_Surface *surface;
|
|
GLuint textureid;
|
|
int mode;
|
|
surface = IMG_Load(filename);
|
|
// Or if you don't use SDL_image you can use SDL_LoadBMP here instead:
|
|
// surface = SDL_LoadBMP(filename);
|
|
|
|
// could not load filename
|
|
if (!surface) {
|
|
return 0;
|
|
}
|
|
|
|
// work out what format to tell glTexImage2D to use...
|
|
if (surface->format->BytesPerPixel == 3) { // RGB 24bit
|
|
mode = GL_RGB;
|
|
|
|
} else if (surface->format->BytesPerPixel == 4) { // RGBA 32bit
|
|
mode = GL_RGBA;
|
|
} else {
|
|
SDL_FreeSurface(surface);
|
|
return 0;
|
|
}
|
|
|
|
*textw=surface->w;
|
|
*texth=surface->h;
|
|
// create one texture name
|
|
glGenTextures(1, &textureid);
|
|
// tell opengl to use the generated texture name
|
|
glBindTexture(GL_TEXTURE_2D, textureid);
|
|
// this reads from the sdl surface and puts it into an opengl texture
|
|
glTexImage2D(GL_TEXTURE_2D, 0, mode, surface->w, surface->h, 0, mode, GL_UNSIGNED_BYTE, surface->pixels);
|
|
// these affect how this texture is drawn later on...glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
|
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
// clean up
|
|
SDL_FreeSurface(surface);
|
|
return textureid;
|
|
|
|
}
|
|
|
|
GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path){
|
|
|
|
// Create the shaders
|
|
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
|
|
GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
|
|
|
|
// Read the Vertex Shader code from the file
|
|
std::string VertexShaderCode;
|
|
std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
|
|
if(VertexShaderStream.is_open()){
|
|
std::string Line = "";
|
|
while(getline(VertexShaderStream, Line))
|
|
VertexShaderCode += "\n" + Line;
|
|
VertexShaderStream.close();
|
|
}else{
|
|
printf("Impossible to open %s. Are you in the right directory ? Don't forget to read the FAQ !\n", vertex_file_path);
|
|
getchar();
|
|
return 0;
|
|
}
|
|
|
|
// Read the Fragment Shader code from the file
|
|
std::string FragmentShaderCode;
|
|
std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
|
|
if(FragmentShaderStream.is_open()){
|
|
std::string Line = "";
|
|
while(getline(FragmentShaderStream, Line))
|
|
FragmentShaderCode += "\n" + Line;
|
|
FragmentShaderStream.close();
|
|
}
|
|
|
|
GLint Result = GL_FALSE;
|
|
int InfoLogLength;
|
|
|
|
|
|
// Compile Vertex Shader
|
|
char const * VertexSourcePointer = VertexShaderCode.c_str();
|
|
glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
|
|
glCompileShader(VertexShaderID);
|
|
|
|
// 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]);
|
|
printf("%s\n", &VertexShaderErrorMessage[0]);
|
|
}
|
|
|
|
|
|
|
|
// Compile Fragment Shader
|
|
char const * FragmentSourcePointer = FragmentShaderCode.c_str();
|
|
glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
|
|
glCompileShader(FragmentShaderID);
|
|
|
|
// 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]);
|
|
printf("%s\n", &FragmentShaderErrorMessage[0]);
|
|
}
|
|
|
|
|
|
|
|
// Link the program
|
|
GLuint ProgramID = glCreateProgram();
|
|
glAttachShader(ProgramID, VertexShaderID);
|
|
glAttachShader(ProgramID, FragmentShaderID);
|
|
glLinkProgram(ProgramID);
|
|
|
|
// 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]);
|
|
printf("%s\n", &ProgramErrorMessage[0]);
|
|
}
|
|
|
|
|
|
glDetachShader(ProgramID, VertexShaderID);
|
|
glDetachShader(ProgramID, FragmentShaderID);
|
|
|
|
glDeleteShader(VertexShaderID);
|
|
glDeleteShader(FragmentShaderID);
|
|
|
|
return ProgramID;
|
|
}
|