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);

 
  
}


