diff --git a/main.c b/main.c index da20977..8732666 100644 --- a/main.c +++ b/main.c @@ -14,6 +14,8 @@ SDL_GLContext glcontext = NULL; GLuint program; GLuint vbo; +GLuint ibo; +GLuint projMatrLoc; static double FPS = INITIAL_FPS; static double FrameTime = 1.0 / INITIAL_FPS; @@ -34,8 +36,32 @@ static void SetTitle ( SDL_Window *window ) SDL_SetWindowTitle(window, title); } +float toRad ( float deg ) +{ + /* 180 deg = pi */ + /* "deg" deg = x */ + return deg * 3.141593f / 180.0f; +} + void resizeWindow ( int width, int height ) { + float n = 1.0f; // near + float f = 3.0f; // far + float fov = toRad(90); // 90 or 65 for console + float aspect = width / (float) height; + float t = n * tanf (fov / 2.0f); + float r = t * aspect; + + float projMatr[] = { + n/r, 0, 0, 0, + 0, n/t, 0, 0, + 0, 0, (f+n)/(n-f), -1, + 0, 0, 2.0f*n*f/(n-f), 0 + }; // it's not rows, it's columns, 'GL_FALSE' + SDL_LogVerbose(SDL_LOG_CATEGORY_RENDER, "n=%.1f f=%.1f fov=%.2f aspect=%.2f t=%.2f r=%.2f\n", n, f, fov, aspect, t, r); + glUseProgram(program); + glUniformMatrix4fv(projMatrLoc, 1, GL_FALSE, projMatr); + glUseProgram(0); glViewport(0, 0, (GLsizei)width, (GLsizei)height); } @@ -144,32 +170,36 @@ void createProgram ( GLuint *shaders, int len ) void createBuffer ( void ) { + GLushort indices[] = { + 0, 1, 2, + 0, 2, 3 + }; float vertices[] = { - -1.0f, -1.0f, 1.0f, 1.0f, // left-bottom - 1.0f, -1.0f, 1.0f, 1.0f, // right-bottom - 0.0f, 1.0f, -1.0f, 1.0f, // top - - -1.0f, 1.0f, 1.0f, 1.0f, // left-top - 1.0f, 1.0f, 1.0f, 1.0f, // right-top - 0.0f, -1.0f, -1.0f, 1.0f, // bottom + -1.0f, -1.0f, -2.0f, 1.0f, // left-bottom + -1.0f, 1.0f, -2.0f, 1.0f, // left-top + 1.0f, 1.0f, -2.0f, 1.0f, // right-top + 1.0f, -1.0f, -2.0f, 1.0f, // right-bottom // colours 1.0f, 0.0f, 0.0f, 1.0f, // red 0.0f, 1.0f, 0.0f, 1.0f, // green - 0.0f, 0.0f, 1.0f, 1.0f, // blue - - 1.0f, 1.0f, 0.0f, 1.0f, // yellow 1.0f, 0.0f, 1.0f, 1.0f, // purple - 0.0f, 1.0f, 1.1f, 1.0f // aqua + 1.0f, 1.0f, 0.0f, 1.0f // yellow }; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glGenBuffers(1, &ibo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void setUniformLocation ( void ) { - /* offsetLoc = glGetUniformLocation(program, "_offset"); */ + projMatrLoc = glGetUniformLocation(program, "projMatr"); } void startShaderProg ( void ) @@ -203,9 +233,10 @@ void _GLBuffer( void ) glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); - glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void *) (6*4*sizeof(float))); - glDrawArrays(GL_TRIANGLES, 0, 6); + glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void *) (4*4*sizeof(float))); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); @@ -216,10 +247,10 @@ int main( int argc, char* argv[] ) { const int WIDTH = 640; const int HEIGHT = 480; - int delay_threshold = 2; - int r, g, b, alpha_s, depth_s, stencil_s, dbuffer, GLJ, GLN, GLAccel, GLP = 0; - double sleep_time = 0; - double time_counter = 0; + int delayThreshold = 2; + int r, g, b, alpha_s, depth_s, stencil_s, dbuffer, glVersionMa, glVersionMi, glAccel, glProfile = 0; + double sleepTime = 0; + double timeCounter = 0; bool loopShouldStop = false; SDL_SetHint(SDL_HINT_RENDER_VSYNC, 0); @@ -244,7 +275,7 @@ int main( int argc, char* argv[] ) SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); PerformancePeriod = 1.0 / SDL_GetPerformanceFrequency(); - time_counter = GetTime(); + timeCounter = GetTime(); window = SDL_CreateWindow("Hello SDL", WIDTH, HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); if (!window) { @@ -270,10 +301,10 @@ int main( int argc, char* argv[] ) } SDL_LogVerbose(SDL_LOG_CATEGORY_RENDER, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); - SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &GLP); - SDL_GL_GetAttribute(SDL_GL_ACCELERATED_VISUAL, &GLAccel); - SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &GLJ); - SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &GLN); + SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &glProfile); + SDL_GL_GetAttribute(SDL_GL_ACCELERATED_VISUAL, &glAccel); + SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &glVersionMa); + SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &glVersionMi); SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &r); SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &g); SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &b); @@ -282,8 +313,8 @@ int main( int argc, char* argv[] ) SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &stencil_s); SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &dbuffer); - SDL_LogVerbose(SDL_LOG_CATEGORY_RENDER, "OpenGL Versin: %d.%d, OpenGL Accelerated: %d, OpenGL Profile Mask: %d", - GLJ, GLN, GLAccel, GLP); + SDL_LogVerbose(SDL_LOG_CATEGORY_RENDER, "OpenGL Version: %d.%d, OpenGL Accelerated: %d, OpenGL Profile Mask: %d", + glVersionMa, glVersionMi, glAccel, glProfile); SDL_LogVerbose(SDL_LOG_CATEGORY_RENDER, "Red size: %d, Green size: %d, Blue size: %d, Alpha size: %d, Depth size: %d, Stencil size: %d, DoubleBuffer: %d", r, g, b, alpha_s, depth_s, stencil_s, dbuffer); @@ -323,20 +354,20 @@ int main( int argc, char* argv[] ) panicError(); } - sleep_time = time_counter - GetTime(); - if (sleep_time * 1000 > delay_threshold) { - Uint32 ms = (Uint32)(sleep_time * 1000) - delay_threshold; + sleepTime = timeCounter - GetTime(); + if (sleepTime * 1000 > delayThreshold) { + Uint32 ms = (Uint32)(sleepTime * 1000) - delayThreshold; SDL_Delay(ms); - if (time_counter < GetTime()) { - delay_threshold++; - SDL_Log("Slept too long. Increased threshold to %u ms", delay_threshold); + if (timeCounter < GetTime()) { + delayThreshold++; + SDL_Log("Slept too long. Increased threshold to %u ms", delayThreshold); } } - while (time_counter > GetTime()) { + while (timeCounter > GetTime()) { /* Waiting for the right moment. */ } - time_counter += FrameTime; + timeCounter += FrameTime; } SDL_DestroyWindow(window); diff --git a/vertex.glsl b/vertex.glsl index bbe5f5e..2ca6eca 100644 --- a/vertex.glsl +++ b/vertex.glsl @@ -3,10 +3,12 @@ layout(location = 0) in vec4 pos; layout(location = 1) in vec4 colour; +uniform mat4 projMatr; + smooth out vec4 _colour; void main() { - gl_Position = pos; + gl_Position = projMatr * pos; _colour = colour; }