OpenGL_Clock/main.c

146 lines
3.9 KiB
C
Raw Normal View History

2018-02-05 22:28:51 +00:00
// Include standard headers
#include <stdio.h>
#include <stdlib.h>
// Include GLEW
#include <GL/glew.h>
// Include GLFW
#include <GLFW/glfw3.h>
2018-02-07 00:24:12 +00:00
// Include shader
#include "shader.h"
2018-02-05 22:28:51 +00:00
GLFWwindow* window;
2018-02-06 23:02:56 +00:00
int main(void) {
2018-02-05 22:28:51 +00:00
// Initialise GLFW
2018-02-06 23:02:56 +00:00
if(!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFW\n");
2018-02-05 22:28:51 +00:00
getchar();
return -1;
}
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// Open a window and create its OpenGL context
2018-02-06 23:02:56 +00:00
window = glfwCreateWindow(1024, 768, "OpenGL Clock", NULL, NULL);
if (window == NULL) {
fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n");
2018-02-05 22:28:51 +00:00
getchar();
glfwTerminate();
return -1;
}
2018-02-06 23:02:56 +00:00
2018-02-05 22:28:51 +00:00
glfwMakeContextCurrent(window);
// Initialize GLEW
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
getchar();
glfwTerminate();
return -1;
}
// Ensure we can capture the escape key being pressed below
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
// Dark grey background
glClearColor(0.15f, 0.15f, 0.15f, 0.0f);
2018-02-07 00:24:12 +00:00
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
// Create and compile our GLSL program from the shaders
GLuint programID;
if (LoadShaders(&programID,
"../shaders/SimpleVertexShader.vertexshader",
"../shaders/SimpleFragmentShader.fragmentshader")) {
fprintf(stderr, "Could not load shaders.\n");
return -1;
}
2018-02-07 00:24:12 +00:00
2018-02-17 00:33:45 +00:00
static GLfloat g_vertex_buffer_data[] = {
2018-02-07 00:24:12 +00:00
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
2018-02-17 00:33:45 +00:00
// position
double a[3];
a[0] = 0;
a[1] = 0;
a[2] = 0;
// horizontal angle : toward -Z
double horizontalAngle = 3.14f;
// vertical angle : 0, look at the horizon
double verticalAngle = 0.0f;
// Initial Field of View
double initialFoV = 45.0f;
double speed = 3.0f; // 3 units / second
double mouseSpeed = 0.005f;
// Get mouse position
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
2018-02-06 23:02:56 +00:00
do {
// Clear the screen. It's not mentioned before Tutorial 02,
// but it can cause flickering, so it's there nonetheless.
glClear(GL_COLOR_BUFFER_BIT);
2018-02-05 22:28:51 +00:00
2018-02-07 00:24:12 +00:00
// Use our shader
glUseProgram(programID);
2018-02-17 00:33:45 +00:00
glfwGetCursorPos(window, &xpos, &ypos);
g_vertex_buffer_data[0] = (float)xpos / 1024 * 2 - 1;
g_vertex_buffer_data[1] = 2 - (float)ypos / 768 * 2 - 1;
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
2018-02-07 00:24:12 +00:00
// 1rst attribute buffer : vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0, // attribute 0. No particular reason for 0, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
2018-02-07 22:18:00 +00:00
NULL // array buffer offset
2018-02-07 00:24:12 +00:00
);
// Draw the triangle !
glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle
glDisableVertexAttribArray(0);
2018-02-05 22:28:51 +00:00
// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();
2018-02-06 23:02:56 +00:00
// Check if the ESC key was pressed or the window was closed
} while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0);
2018-02-05 22:28:51 +00:00
// Close OpenGL window and terminate GLFW
glfwTerminate();
return 0;
}