/********************************************************************* * * * FLY * * --E#Y#E-- * * ===MUSCLE=== * * * *********************************************************************/ #include "flybox.h" /*-------------------------------------------------------------------------*/ /* Buffer */ GLuint vbos4[MAX_BUFFERS]; /* Texture */ GLubyte* w_images[SS_MAX_SIDES]; GLuint w_texID[SS_MAX_SIDES]; /*-------------------------------------------------------------------------*/ /* Vertex */ GLfloat colors4[FB]; GLfloat texCoords4[FB]; GLfloat vertices4[FB]; /* Buffer */ GLfloat w_colors[FB]; GLfloat w_texCoords[FB]; GLfloat w_vertices[FB]; /*-------------------------------------------------------------------------*/ /* Shader Program */ unsigned int s_basicProgram; /*-------------------------------------------------------------------------*/ /* Texture */ GLubyte *nor; GLubyte *eas; GLubyte *sou; GLubyte *wes; GLubyte *top; GLubyte *bot; /*-------------------------------------------------------------------------*/ /* Texture Loader */ void textureLoader() { #if PNG_TEXTURE /* Textures PNG */ const char *northPNG; const char *eastPNG; const char *southPNG; const char *westPNG; const char *topPNG; const char *bottomPNG; /* Textures PNG */ northPNG = "PIXEL/FLYBOX/bk.png"; eastPNG = "PIXEL/FLYBOX/rt.png"; southPNG = "PIXEL/FLYBOX/ft.png"; westPNG = "PIXEL/FLYBOX/lt.png"; topPNG = "PIXEL/FLYBOX/up.png"; bottomPNG = "PIXEL/FLYBOX/dn.png"; /* Load PNG */ read_png(northPNG, &nor); read_png(eastPNG, &eas); read_png(southPNG, &sou); read_png(westPNG, &wes); read_png(topPNG, &top); read_png(bottomPNG, &bot); /* Load Textures */ printf(" LOADING TEXTURES 1: \n"); #endif } /*-------------------------------------------------------------------------*/ /* Init Skybox */ char initBox() { glGenBuffers = (PFNGLGENBUFFERSARBPROC)glXGetProcAddress ((const GLubyte*)"glGenBuffers"); glBindBuffer = (PFNGLBINDBUFFERPROC)glXGetProcAddress ((const GLubyte*)"glBindBuffer"); glBufferData = (PFNGLBUFFERDATAPROC)glXGetProcAddress ((const GLubyte*)"glBufferData"); /* Buffer */ if(!glGenBuffers || !glBindBuffer || !glBufferData) { printf("VBO: NOT SUPPORTED \n"); } /*------------------------------------------------------------------*/ #if SLOW_COMPUTER /* Texture File */ int side = 0; const GLint countH = 75; /* Generate Textures */ glGenTextures(SS_MAX_SIDES, w_texID); for(side = 0; side < SS_MAX_SIDES; ++side) { /* SubImage */ MipmapsImage(countH, side, nor); MipmapsImage(countH, side, eas); MipmapsImage(countH, side, sou); MipmapsImage(countH, side, wes); MipmapsImage(countH, side, top); MipmapsImage(countH, side, bot); } #endif /*-----------------------------------------------------------------*/ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glBegin(GL_QUADS); /* Texture Size */ float SIZE = 50.0f; /* Top */ glColor4f(0.01f, 0.01f, 0.01f, 0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-SIZE, SIZE, -SIZE); glTexCoord2f(1.0f, 0.0f); glVertex3f( SIZE, SIZE, -SIZE); glTexCoord2f(1.0f, 1.0f); glVertex3f( SIZE, SIZE, SIZE); glTexCoord2f(0.0f, 1.0f); glVertex3f(-SIZE, SIZE, SIZE); /* Left */ glColor4f(0.10f, 0.20f, 0.30f, 0.5f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-SIZE,-SIZE,-SIZE); glTexCoord2f(1.0f, 1.0f); glVertex3f(-SIZE, SIZE,-SIZE); glTexCoord2f(0.0f, 1.0f); glVertex3f(-SIZE, SIZE, SIZE); glTexCoord2f(0.0f, 0.0f); glVertex3f(-SIZE,-SIZE, SIZE); /* Back */ glColor4f(0.30f, 0.50f, 0.70f, 0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-SIZE,-SIZE,-SIZE); glTexCoord2f(1.0f, 0.0f); glVertex3f( SIZE,-SIZE,-SIZE); glTexCoord2f(1.0f, 1.0f); glVertex3f( SIZE, SIZE,-SIZE); glTexCoord2f(0.0f, 1.0f); glVertex3f(-SIZE, SIZE,-SIZE); /* Right */ glColor4f(0.10f, 0.20f, 0.30f, 0.5f); glTexCoord2f(1.0f, 0.0f); glVertex3f( SIZE,-SIZE, SIZE); glTexCoord2f(1.0f, 1.0f); glVertex3f( SIZE, SIZE, SIZE); glTexCoord2f(0.0f, 1.0f); glVertex3f( SIZE, SIZE,-SIZE); glTexCoord2f(0.0f, 0.0f); glVertex3f( SIZE,-SIZE,-SIZE); /* Bottom */ glColor4f(0.01f, 0.01f, 0.01f, 0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f( SIZE,-SIZE, -SIZE); glTexCoord2f(1.0f, 0.0f); glVertex3f(-SIZE,-SIZE, -SIZE); glTexCoord2f(1.0f, 1.0f); glVertex3f(-SIZE,-SIZE, SIZE); glTexCoord2f(0.0f, 1.0f); glVertex3f( SIZE,-SIZE, SIZE); /* Front */ glColor4f(0.30f, 0.50f, 0.70f, 0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f( SIZE,-SIZE, SIZE); glTexCoord2f(1.0f, 0.0f); glVertex3f(-SIZE,-SIZE, SIZE); glTexCoord2f(1.0f, 1.0f); glVertex3f(-SIZE, SIZE, SIZE); glTexCoord2f(0.0f, 1.0f); glVertex3f( SIZE, SIZE, SIZE); glEnd(); /*-----------------------------------------------------------------*/ glGenBuffers(MAX_BUFFERS, &vbos4[0]); /* Generate a buffer for the color */ glBindBuffer(GL_ARRAY_BUFFER, vbos4[COLOR_BUFFER]); /* Bind the color buffer */ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 4 * FB, &w_colors[0], GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vbos4[VERTEX_BUFFER]); /* Bind the vertex buffer */ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * FB, &w_vertices[0], GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vbos4[NORMAL_BUFFER]); /* Bind the tex coord buffer */ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 2 * FB, &w_texCoords[0], GL_STATIC_DRAW); return TRUE; } /*-------------------------------------------------------------------------*/ /* Render Skybox */ void render(float x, float y, float z, unsigned int s_basicProgram) { glPushMatrix(); glTranslatef(x, y, z); /*-----------------------------------------------------------------*/ /* Matrix */ static float modelviewMatrix[ID]; static float projectionMatrix[ID]; glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMatrix); glGetFloatv(GL_PROJECTION_MATRIX, projectionMatrix); Uniform4x4(s_basicProgram, "modelview_matrix", 0, modelviewMatrix); Uniform4x4(s_basicProgram, "projection_matrix", 1, projectionMatrix); /*-----------------------------------------------------------------*/ /*glDisable(GL_DEPTH_TEST);*/ /*glEnable(GL_CULL_FACE);*/ /* Vertex Array */ glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); /* Attrib Array */ /*glEnableVertexAttribArrayARB(0);*/ /*glEnableVertexAttribArrayARB(1);*/ /*glEnableVertexAttribArrayARB(2);*/ /*-----------------------------------------------------------------*/ glBindBuffer(GL_ARRAY_BUFFER, vbos4[COLOR_BUFFER]); /* Color */ const GLint csize = 4; /* ( R, G, B, A) */ const GLenum ctype = GL_FLOAT; /* the data is 8bit unsigned values */ const GLboolean cnormalize = GL_TRUE; /* normalize the data (convert from 0-255 to 0-1) */ const GLsizei cstride = 0; /* 0 = move forward size * sizeof(type) */ const GLbyte coffset = 0; /* start at the beginning of the buffer */ glColorPointer(csize, ctype, cstride, &colors4[coffset]); /*glVertexAttribPointerARB((GLuint)2, csize, ctype, cnormalize, cstride, &colors4[coffset]);*/ /*-----------------------------------------------------------------*/ glBindBuffer(GL_ARRAY_BUFFER, vbos4[VERTEX_BUFFER]); /* Vertex */ const GLint vsize = 3; /* ( X, Y, Z, W ) */ const GLenum vtype = GL_FLOAT; const GLboolean vnormalize = GL_FALSE; const GLsizei vstride = 0; const GLbyte voffset = 0; glVertexPointer(vsize, vtype, vstride, &vertices4[voffset]); /*glVertexAttribPointerARB((GLuint)0, vsize, vtype, vnormalize, vstride, &vertices4[voffset]);*/ /*-----------------------------------------------------------------*/ glBindBuffer(GL_ARRAY_BUFFER, vbos4[NORMAL_BUFFER]); /* Texture */ const GLint tsize = 2; /* ( S, T, P, Q ) */ const GLenum ttype = GL_FLOAT; const GLboolean tnormalize = GL_FALSE; const GLsizei tstride = 0; const GLbyte toffset = 0; glTexCoordPointer(tsize, ttype, tstride, &texCoords4[toffset]); /*glVertexAttribPointerARB((GLuint)1, tsize, ttype, tnormalize, tstride, &texCoords4[toffset]);*/ /*-----------------------------------------------------------------*/ int i = 0; for(i = 0; i < 6; ++i) { glBindTexture(GL_TEXTURE_2D, w_texID[i]); glDrawArrays(GL_TRIANGLE_FAN, i * 4, 4); } /*-----------------------------------------------------------------*/ /* Disable Array */ /*glDisableVertexAttribArrayARB(2);*/ /*glDisableVertexAttribArrayARB(1);*/ /*glDisableVertexAttribArrayARB(0);*/ /* Disable Client State */ glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); /*glEnable(GL_DEPTH_TEST);*/ glPopMatrix(); } /*-------------------------------------------------------------------------*/