#include "glgfx.h" //buffer handles are the ints that gl returns //buffer data is the data you bind to opengl GLuint vbhandler; //vertex buffer handle GLuint ebhandler; GLuint texhandlers[2]; //handlers for the perspective transforms GLint projhandler; GLint tranhandler; GLint rothandler; GLint camhandler; GLint camposhandler; GLint lightposhandler; //device coordinates // ^ // (y+) // | //<(x-)-+-(x+)> // | // (y-) // v //shaders // z+ is close to screen z- is farther away GLuint vertexshaderhandle; GLuint fragmentshaderhandle; GLuint shaderprogramhandle; int initglgfx() { //glew is the library that links all of opengl's fnctions //for you glewExperimental = GL_TRUE; glewInit(); //glEnable (GL_BLEND); // so we can have transparent polygons //glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //culls back face triagnles, which is determined by whether vertexes are clockwise // or counterclockwise glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); GLuint glnum; glGenBuffers(1, &glnum); printf("%u\n",glnum); //vertex data load of the box model /* float vertexdata[] = { -0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, -0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, -0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.500000,0.500000,-0.500000, 1.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 1.000000,0.000000,0.000000, 0.500000,-0.500000,-0.500000, 1.000000,0.000000,0.000000, 0.500000,-0.500000,-0.500000, 1.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 1.000000,0.000000,0.000000, 0.500000,-0.500000,0.500000, 1.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, -0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, 0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, -0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, -0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, 0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, -0.500000,0.500000,0.500000, -1.000000,0.000000,0.000000, -0.500000,0.500000,-0.500000, -1.000000,0.000000,0.000000, -0.500000,-0.500000,0.500000, -1.000000,0.000000,0.000000, -0.500000,0.500000,-0.500000, -1.000000,0.000000,0.000000, -0.500000,-0.500000,-0.500000, -1.000000,0.000000,0.000000, -0.500000,-0.500000,0.500000, -1.000000,0.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, 0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, -0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, 0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, 0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, -0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, -0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, -0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, };*/ float vertexdata[] = { -0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.000000,1.000000,0.000000, 0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 1.000000,1.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.000000,0.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.000000,0.000000,0.000000, 0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 1.000000,1.000000,0.000000, 0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 1.000000,0.000000,0.000000, 0.500000,0.500000,-0.500000, 1.000000,0.000000,0.000000, 0.000000,1.000000,0.000000, 0.500000,0.500000,0.500000, 1.000000,0.000000,0.000000, 1.000000,1.000000,0.000000, 0.500000,-0.500000,-0.500000, 1.000000,0.000000,0.000000, 0.000000,0.000000,0.000000, 0.500000,-0.500000,-0.500000, 1.000000,0.000000,0.000000, 0.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 1.000000,0.000000,0.000000, 1.000000,1.000000,0.000000, 0.500000,-0.500000,0.500000, 1.000000,0.000000,0.000000, 1.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, 0.000000,1.000000,0.000000, -0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, 1.000000,1.000000,0.000000, 0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, 0.000000,0.000000,0.000000, -0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, 1.000000,1.000000,0.000000, -0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, 1.000000,0.000000,0.000000, 0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, 0.000000,0.000000,0.000000, -0.500000,0.500000,0.500000, -1.000000,0.000000,0.000000, 0.000000,1.000000,0.000000, -0.500000,0.500000,-0.500000, -1.000000,0.000000,0.000000, 1.000000,1.000000,0.000000, -0.500000,-0.500000,0.500000, -1.000000,0.000000,0.000000, 0.000000,0.000000,0.000000, -0.500000,0.500000,-0.500000, -1.000000,0.000000,0.000000, 1.000000,1.000000,0.000000, -0.500000,-0.500000,-0.500000, -1.000000,0.000000,0.000000, 1.000000,0.000000,0.000000, -0.500000,-0.500000,0.500000, -1.000000,0.000000,0.000000, 0.000000,0.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, 0.000000,0.000000,0.000000, 0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, 1.000000,1.000000,0.000000, -0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, 0.000000,1.000000,0.000000, 0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, 1.000000,0.000000,0.000000, 0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, 1.000000,1.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, 0.000000,0.000000,0.000000, -0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, 0.000000,0.000000,0.000000, -0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 1.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 1.000000,1.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 1.000000,1.000000,0.000000, 0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, 0.000000,1.000000,0.000000, -0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, 0.000000,0.000000,0.000000, }; /* float vertexdata[] = { -0.5, 0.5, -.5, // x y z 0.5, 0.5, -.5, 0.5, -0.5, -.5, -0.5, -0.5, -.5, -0.5, 0.5, 0.5, // x y z 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, //normal positions 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, }; */ //polygons of the box mode based on the vertex data. //they must be clockwise from the front so that they are culled when not //seen /* GLuint elementdata[] = { 0,12, 1,12, 3,12, 3,12, 1,12, 2,12, 1,8, 5,8, 2,8, 2,8, 5,8, 6,8, 5,13, 4,13, 6,13, 4,13, 7,13, 6,13, 4,9, 0,9, 7,9, 0,9, 3,9, 7,9, 3,11, 6,11, 7,11, 2,11, 6,11, 3,11, 0,10, 4,10, 5,10, 5,10, 1,10, 0,10, }; */ GLuint elementdata[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35 }; //binds to the element buffer glGenBuffers(1,&vbhandler); glBindBuffer(GL_ARRAY_BUFFER,vbhandler); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexdata), vertexdata, GL_DYNAMIC_DRAW); glGenBuffers(1,&ebhandler); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebhandler); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elementdata), elementdata, GL_DYNAMIC_DRAW); //loads textures glGenTextures(2, texhandlers); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texhandlers[0]); glgfxloadtexture("textures/tex.bmp"); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texhandlers[1]); glgfxloadtexture("textures/elev.bmp"); //loads the shaders genshaders(); glUniform1i(glGetUniformLocation(shaderprogramhandle, "tex"), 0); glUniform1i(glGetUniformLocation(shaderprogramhandle, "elev"), 1); } //loads shaders and models int genshaders() { //flowchart //vertex shader receives raw vertex data, outputs that data transformed in 3d space(camera), that data is passed to //geometry shader, which is where we will add normal vector for //light calculations // also where we make the volumetric information //all these are rasterized, and blended for every pixel value //then passed to fragment shader //which is where we do the light calculations //tests and blending(multiple buffers?) //reads from files //debug printout //printf(readfile("vertexshader.glsl").c_str()); std::string vertexshadersource = readfile("vertexshader.glsl").c_str(); std::string fragmentshadersource = readfile("fragmentshader.glsl").c_str(); const char * vertexshaderstr = vertexshadersource.c_str(); const char * fragmentshaderstr = fragmentshadersource.c_str(); GLuint vertexshaderhandle = glCreateShader(GL_VERTEX_SHADER); int vertexshaderlen = vertexshadersource.length(); //length of the source must be specified glShaderSource(vertexshaderhandle, 1, (&vertexshaderstr), &vertexshaderlen); glCompileShader(vertexshaderhandle); //error buffer char buffer[512]; GLint err; glGetShaderiv(vertexshaderhandle, GL_COMPILE_STATUS, &err); if (err == GL_FALSE) { glGetShaderInfoLog(vertexshaderhandle, 512, NULL, buffer); printf("error compiling vertex shhader\n"); printf(buffer); } GLuint fragmentshaderhandle = glCreateShader(GL_FRAGMENT_SHADER); int fragmentshaderlen = fragmentshadersource.length(); //the length of the source must be specified glShaderSource(fragmentshaderhandle, 1, (&fragmentshaderstr), &fragmentshaderlen); glCompileShader(fragmentshaderhandle); glGetShaderiv(fragmentshaderhandle, GL_COMPILE_STATUS, &err); if (err == GL_FALSE) { glGetShaderInfoLog(fragmentshaderhandle, 512, NULL, buffer); printf("error compiling fragment shader\n"); printf(buffer); } //make the shader program shaderprogramhandle = glCreateProgram(); glAttachShader(shaderprogramhandle,vertexshaderhandle); glAttachShader(shaderprogramhandle,fragmentshaderhandle); //the 0 is which buffer, 0 is the default, 1 will be fore volumetric shading glBindFragDataLocation(shaderprogramhandle,0,"outpix"); glLinkProgram(shaderprogramhandle); glUseProgram(shaderprogramhandle); //vertex data GLint pos; pos = glGetAttribLocation(shaderprogramhandle, "position"); //the actual atribute, number of values, type, whether they need to be normalied to -1 1, //number of bytes between values, offset from beginning in bytes glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), 0); glEnableVertexAttribArray(pos); GLint vnorm; vnorm = glGetAttribLocation(shaderprogramhandle, "vnormal"); //the actual atribute, number of values, type, whether they need to be normalied to -1 1, //number of bytes between values, offset from beginning in bytes glVertexAttribPointer(vnorm, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (3 * sizeof(float)) ); glEnableVertexAttribArray(vnorm); GLint texcoord; texcoord = glGetAttribLocation(shaderprogramhandle, "texcoord"); //the actual atribute, number of values, type, whether they need to be normalied to -1 1, //number of bytes between values, offset from beginning in bytes glVertexAttribPointer(texcoord, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (6 * sizeof(float)) ); glEnableVertexAttribArray(texcoord); //getting uniform handler projhandler = glGetUniformLocation(shaderprogramhandle, "proj"); camhandler = glGetUniformLocation(shaderprogramhandle, "cam"); tranhandler = glGetUniformLocation(shaderprogramhandle, "tran"); rothandler = glGetUniformLocation(shaderprogramhandle, "rot"); lightposhandler = glGetUniformLocation(shaderprogramhandle, "lightpos"); camposhandler = glGetUniformLocation(shaderprogramhandle, "campos"); } //opens a filebuffer stream and reads every char std::string readfile(char const * filename) { std::ifstream filebuffer; std::string line; std::string rstr; rstr = ""; char c; filebuffer.open(filename); if (!filebuffer.is_open()) { printf("error reading file"); } while (filebuffer.get(c)) { rstr = rstr + c; } filebuffer.close(); return rstr; } int setcam (float cpx, float cpy, float cpz, float clx, float cly, float clz, float cux, float cuy, float cuz) { //lookat eye position of camera, center center of screen, up up direction //glm::mat4 cam = glm::lookAt(glm::vec3(0,0,1), glm::vec3(0,0,0),glm::vec3(0,1,0)); glm::mat4 cam = glm::lookAt(glm::vec3(cpx, cpy, cpz), glm::vec3(clx, cly, clz), glm::vec3(cux, cuy, cuz)); glUniformMatrix4fv(camhandler, 1, GL_FALSE, glm::value_ptr(cam)); glUniform3fv(camposhandler, 1, glm::value_ptr(glm::vec3(cpx,cpy,cpz))); return 0; } int setlight (float x, float y, float z) { glUniform3fv(camposhandler, 1, glm::value_ptr(glm::vec3(x,y,z))); return 0; } //draws the model, setting perspective transform and position transform //done with magic numbers for now for testing purposes int drawmodel(float x, float y, float z, float xr, float yr, float zr, float s) { // the transformation matrix = rotation matrix of object * scaling matrix * translaton matrix representing difference in camera and object location * -rotation matrix of the camera * perspective transform //order of application ir right to left //fov, aspect ratio, size of near and far planes distance glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)maxx/(float)maxy, 0.1f, 100.0f); glUniformMatrix4fv(projhandler, 1, GL_FALSE, glm::value_ptr(proj)); //a valid tranlation matrix showing the colun first conventions of glm::mat4 //tran = glm::mat4( // glm::vec4(1.0f,0.0f,0.0f,0.0f), //x transform is the one on the last column // glm::vec4(0.0f,1.0f,0.0f,0.0f), //y // glm::vec4(0.0f,0.0f,1.0f,0.0f), // z // glm::vec4(0.0f,0.0f,0.5f,1.0f) //w just make it 1 //); //the translation matrix, matrixes added last are applied first glm::mat4 tran; tran = glm::scale(tran, glm::vec3(s,s,s)); tran = glm::translate(tran, glm::vec3(x,y,z)); tran = glm::rotate(tran,glm::radians(xr),glm::vec3(1,0,0)); // axis of rotation x y z tran = glm::rotate(tran,glm::radians(yr),glm::vec3(0,1,0)); tran = glm::rotate(tran,glm::radians(zr),glm::vec3(0,0,1)); glm::mat4 rot; rot = glm::rotate(rot,glm::radians(xr),glm::vec3(1,0,0)); // axis of rotation x y z rot = glm::rotate(rot,glm::radians(yr),glm::vec3(0,1,0)); rot = glm::rotate(rot,glm::radians(zr),glm::vec3(0,0,1)); //deprecated debug stuff //printf("translated vector x%f\n",(tran * glm::vec4(1.0f,0.0f,0.0f,1.0f)).x); //printf("translated vector y%f\n",(tran * glm::vec4(0.0f,1.0f,0.0f,1.0f)).y); //printf("translated vector z%f\n",(tran * glm::vec4(0.0f,0.0f,1.0f,1.0f)).z); //printf("translated vector x%f\n",(rot * glm::vec4(1.0f,0.0f,0.0f,1.0f)).x); //printf("translated vector y%f\n",(rot * glm::vec4(0.0f,1.0f,0.0f,1.0f)).y); //printf("translated vector z%f\n",(rot * glm::vec4(0.0f,0.0f,1.0f,1.0f)).z); //loads the transaltion stuff glUniformMatrix4fv(tranhandler, 1, GL_FALSE, glm::value_ptr(tran)); glUniformMatrix4fv(rothandler, 1, GL_FALSE, glm::value_ptr(rot)); //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); glDrawArrays(GL_TRIANGLES,0,36); } int quitglgfx() { } int clearglgfx() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); return 0; } int glgfxloadtexture (const char * file) { SDL_Surface * tsp; tsp = SDL_LoadBMP(file); //we're just gonna forget their handlers since loading texture data is a //one time thing anyways //texture to bind to, detail,format, printf("num of pixels\n %d \n", tsp->format->BitsPerPixel); //32 bits per pixel printf("Rmask\n %04x \n", tsp->format->Rmask); // ff000000 printf("Gmask\n %04x \n", tsp->format->Gmask); // 00ff0000 printf("Bmask\n %04x \n", tsp->format->Bmask); // 0000ff00 printf("Amask\n %04x \n", tsp->format->Amask); // 000000ff tsp = SDL_ConvertSurfaceFormat(tsp, SDL_PIXELFORMAT_RGBA32, 0); //int w; //int h; //int c; //unsigned char * data =SOIL_load_image(file, &w, &h,&c, SOIL_LOAD_BMP); //printf("w%d\n",h); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tsp->w, tsp->h, 0, GL_RGBA, GL_UNSIGNED_BYTE,(void *) tsp->pixels); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); //drawimg(0,0,100,100,file); SDL_FreeSurface(tsp); }