MAIN.CPP
------------------------------------
//////////////////////////////
//Main Libary
/////////////////////////////
#define NO_SDL_GLEXT
#include <glew.h>
#include "SDL/SDL.H"
#include "SDL/SDL_IMAGE.H"
#include "SDL/SDL_OPENGL.H"
#undef main
#include <iostream>
#include <cassert>
#include <string>
#include <algorithm>
#include <boost/iostreams/stream.hpp>
#include <libs/iostreams/example/container_device.hpp>
#include <boost/filesystem.hpp>
#include <boost/iostreams/categories.hpp>
#include <boost/algorithm/string.hpp>
#include <vector>
#include <fstream>
#include "GL/glu.h"
////////////////////////////
using namespace std;
///////////////////////////
//DEFINES
///////////////////////////
#define SCREEN_WIDTH 1240
#define SCREEN_HEIGHT 960
#define BPP 32
#define GL_GLEXT_PROTOTYPES
#define GetError( )\
{\
for ( GLenum Error = glGetError( ); ( GL_NO_ERROR != Error ); Error = glGetError( ) )\
{\
switch ( Error )\
{\
case GL_INVALID_ENUM: printf( "\n%s\n\n", "GL_INVALID_ENUM" ); assert( 0 ); break;\
case GL_INVALID_VALUE: printf( "\n%s\n\n", "GL_INVALID_VALUE" ); assert( 0 ); break;\
case GL_INVALID_OPERATION: printf( "\n%s\n\n", "GL_INVALID_OPERATION" ); assert( 0 ); break;\
case GL_OUT_OF_MEMORY: printf( "\n%s\n\n", "GL_OUT_OF_MEMORY" ); assert( 0 ); break;\
default: break;\
}\
}\
}
///////////////////////////
////////////////////////////
//Other Header Files
///////////////////////////
#include "GraphicalUserInterface.h"
#include "SurfaceStorage.h"
//////////////////////////
//Load Shader Function
GLuint LoadProgram(const char * vertex_file_path, const char * Fragment_file_path){
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
//READ THE VERTEX SHADER CODE
string VertexShaderCode;
ifstream VertexShaderStream(vertex_file_path, std::ios::in);
if(VertexShaderStream.is_open())
{
string Line = "";
while(getline(VertexShaderStream, Line))
VertexShaderCode += "\n" + Line;
VertexShaderStream.close();
}
//READ THE FRAGMENT SHADER CODE
string FragmentShaderCode;
ifstream FragmentShaderStream(Fragment_file_path, std::ios::in);
if(FragmentShaderStream.is_open())
{
string Line = "";
while(getline(FragmentShaderStream, Line))
FragmentShaderCode += "\n" + Line;
FragmentShaderStream.close();
}
GLint Result = GL_FALSE;
int InfoLogLength;
//Compile Vertex Shader
printf("Compiling Shader : %s\n", vertex_file_path);
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);
vector<char> VertexShaderErrorMessage(InfoLogLength);
glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]);
//Compile Fragment Shader
printf("Compiling Shader : %s\n", Fragment_file_path);
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);
vector<char> FragmentShaderErrorMessage(InfoLogLength);
glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]);
fprintf(stdout, "Linking Program\n");
GLuint ProgramID = glCreateProgram();
glBindAttribLocation(ProgramID, 3, "texture_coordinate" );
//Link The Program
glAttachShader(ProgramID, VertexShaderID);
glAttachShader(ProgramID, FragmentShaderID);
glLinkProgram(ProgramID);
//Check The Program
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
vector<char> ProgramErrorMessage( max(InfoLogLength, int(1)) );
fprintf(stdout, "%s\n", &ProgramErrorMessage[0]);
//Delete Shader
glDeleteShader(VertexShaderID);
glDeleteShader(FragmentShaderID);
glUseProgram(ProgramID);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<GLvoid*>(3 * sizeof(float)));
int samplerLocation = glGetUniformLocation(ProgramID, "texture");
int texture_coordinate = glGetUniformLocation(ProgramID, "texture_coordinate");
int my_vec3_location = glGetUniformLocation(ProgramID, "translations");
//HOW TO DECLARE GLGETUNIFORMLOCATION // -2 6 0
glUniform3f(my_vec3_location, -1.0, 0.5, 1);
glUniform1i(samplerLocation, 0);
return ProgramID;
}
bool GUIToggle = true;
int main(int argc , char *argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);
//Screen Position
SDL_putenv("SDL_VIDEO_CENTERED=center");
//Screen Setup
Screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,BPP,SDL_OPENGL|SDL_DOUBLEBUF);
//glew setup
GLenum err = glewInit();
glGetError();
if (GLEW_OK != err)
{
/* Problem: glewInit failed, something is seriously wrong. */
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
}
fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
/////////////////////////////
//OpenGL - Viewport Setup
////////////////////////////
//Clear Color
glClearColor(0.0,0.0,0.0,0.0);
//Model View Matrix Setup
//glMatrixMode(GL_MODELVIEW);
//Reset Matrix
//glLoadIdentity();
//Projection Matrix Setup
//glMatrixMode(GL_PROJECTION);
//Projection Setup
// glOrtho(0, 1240,0,960,-1,1);
//gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
// glOrtho( -SCREEN_WIDTH * 0.5f,SCREEN_WIDTH * 0.5f, -SCREEN_HEIGHT * 0.5f, SCREEN_HEIGHT * 0.5f,-1.0f, 1.0f );
glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
GetError();
////////////////////////////////////////////////////
//On and Off Switch for Application
bool done = false;
//SDL Event
SDL_Event event;
//Top File Menu <Top ToolBar>
SDL_Surface *TopFileMenuSurf = NULL;
TopFileMenuSurf = IMG_Load("GUI/FileMenu.png");
//Create and Compile our glsl program from the shaders
GLuint programID = LoadProgram("graphicaluserinterface.v","graphicaluserinterface.f");
GLuint texture;
glGenTextures( 1, &texture );
//this will identify our vertex buffer
GLuint vertexbuffer;
//generate a buffer
glGenBuffers(1, &vertexbuffer);
//Bind Texture to OpenGL
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D( GL_TEXTURE_2D, 0,GL_RGB, TopFileMenuSurf->w,TopFileMenuSurf->h, 0,
GL_RGBA, GL_UNSIGNED_BYTE, TopFileMenuSurf->pixels );
glActiveTexture(GL_TEXTURE0);
//////////////////
//IMAGE LOADING
/////////////////
//Main While Loop
while(!done)
{
//Clear
glClear(GL_COLOR_BUFFER_BIT);
//Logic
//Draw GUI
if(GUIToggle == true)
{
//Graphical User Interface Shader
glUseProgram(programID);
GUI();
//Drawing GUI and Controls
}
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
return 0;
break;
}
}
//Update
SDL_GL_SwapBuffers();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
GRAPHICAL USER INTERFACE.H
--------------------------------------
//////////////////////////////
//Main Libary
/////////////////////////////
#define NO_SDL_GLEXT
#include <glew.h>
#include "SDL/SDL.H"
#include "SDL/SDL_IMAGE.H"
#include "SDL/SDL_OPENGL.H"
#undef main
#include <iostream>
#include <cassert>
#include <string>
#include <algorithm>
#include <boost/iostreams/stream.hpp>
#include <libs/iostreams/example/container_device.hpp>
#include <boost/filesystem.hpp>
#include <boost/iostreams/categories.hpp>
#include <boost/algorithm/string.hpp>
#include <vector>
#include <fstream>
#include "GL/glu.h"
////////////////////////////
using namespace std;
///////////////////////////
//DEFINES
///////////////////////////
#define SCREEN_WIDTH 1240
#define SCREEN_HEIGHT 960
#define BPP 32
#define GL_GLEXT_PROTOTYPES
#define GetError( )\
{\
for ( GLenum Error = glGetError( ); ( GL_NO_ERROR != Error ); Error = glGetError( ) )\
{\
switch ( Error )\
{\
case GL_INVALID_ENUM: printf( "\n%s\n\n", "GL_INVALID_ENUM" ); assert( 0 ); break;\
case GL_INVALID_VALUE: printf( "\n%s\n\n", "GL_INVALID_VALUE" ); assert( 0 ); break;\
case GL_INVALID_OPERATION: printf( "\n%s\n\n", "GL_INVALID_OPERATION" ); assert( 0 ); break;\
case GL_OUT_OF_MEMORY: printf( "\n%s\n\n", "GL_OUT_OF_MEMORY" ); assert( 0 ); break;\
default: break;\
}\
}\
}
///////////////////////////
////////////////////////////
//Other Header Files
///////////////////////////
#ifndef SURFACESTORAGE_H
#define SURFACESTORAGE_H
#endif
//////////////////////////
//////////////////////////////////////////////
//ONLY FOR CONTROLS AND DRAWING GUI GRAPHICS
/////////////////////////////////////////////
void GUI(void)
{
//this will identify our vertex buffer
GLuint vertexbuffer;
//generate a buffer
glGenBuffers(1, &vertexbuffer);
// X //y //z //u //v
GLfloat vVerts[] = { 0.5f, 0.5f, 0.0f, 1.0f, 1.0f ,
0.0f, 0.5f, 0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f, 1.0f, 0.0f};
//tex x and y
//to mix texture with color for shading
//glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
//this binds the buffer the array buffer with your buffer
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
//Give are vertices to opengl
glBufferData(GL_ARRAY_BUFFER, sizeof(vVerts), vVerts, GL_STATIC_DRAW);
//1st attribute buffer : vertices
glEnableVertexAttribArray(0);
//glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3,GL_FLOAT,GL_FALSE, 5 * sizeof(float),0);
glDrawArrays(GL_QUADS, 0, 4);
glDisableVertexAttribArray(0);
//FOR DRAWING VERTICES ONTO THE SCREEN ONLY
//GLfloat tex_u; GLfloat tex_v;
//Rather then GlVertex you make 3 vectors in an glfloat
}
FRAGMENT SHADER
----------------------
#version 150
//orginally 130
//orginally 110
//Texture Uniform Sampler 2D Container
uniform sampler2D texture;
in vec2 texture_coord;
varying vec3 texture_coordinate;
//Main Entry Point
void main(void){
//To Tell GLSL The Texture and Texture Coords texture cords is the position
gl_FragColor = texture(texture, texture_coord);
//vec4(1.0, 0.0, 0.0, 1.0);
//gl_FragColor = vec4(texture_coordinate.xy, 0.0, 1.0);
}
VERTEX SHADER
---------------
#version 150
//Always use a attribute vec4 for position variable
in vec4 position;
//Matrix 3 x 3 row
//mat4 projection;
//Texture Cordinates 2 element vector of varying type
//attribute vec2 texture_coordinate;
out vec2 texture_coordinate;
out vec2 texture_coord;
//Translations 3 element vector uniform
uniform vec3 translations;
//Projection Matrix
//mat4 projection = mat4(
// vec4(1.0, 0.0, 0.0, 0.0),
// vec4(0.0, 1.0, 0.0, 0.0),
// vec4(0.0, 0.0, 1.0, 0.0),
// vec4(0.0, 0.0, 0.0, 1.0));
//Main Entry Point
void main()
{
//Passing The Texture Coordinate of Texture Unit 0 To The Fragment Shader
texture_coord = (texture_coordinate);
// To Put The Vertex in View? //ORGINALLY 8.0
gl_Position = vec4(position.xyz + translations.xyz, 1.0);
}