#include <iostream>
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;
float xTransition = 0;
float yTransition = 0;
static void Initialize(void);
void RenderBird();
void processInput(GLFWwindow* window);
void RenderScene(GLFWwindow* window) {
//glRotatef((float)glfwGetTime() * 5.f, 0.f, 0.f, 1.f);
glBegin(GL_LINES);
glVertex2f(.25, 0.25);
glVertex2f(.75, .75);
glEnd();
glFlush();
}
void RenderCircle() {
int i;
int triangles = 180; // number of triangles
int a = 0.2;
int b = 0.2;
float twoPi = 2.0f * 3.14159f;
float radius = 0.5;
glPointSize(5);
//glBegin(GL_POINTS);
//glBegin(GL_LINE_LOOP);
//glBegin(GL_POLYGON);
glBegin(GL_TRIANGLE_FAN);
//glVertex2f(a, b); // origin
for (i = 0; i <= triangles; i++) {
float x = radius * cos(i * twoPi / triangles);
float y = radius * sin(i * twoPi / triangles);
glVertex2f(a + x, b + y);
}
glEnd();
}
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_ANY_PROFILE);
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
glfwMakeContextCurrent(window);
while (!glfwWindowShouldClose(window))
{
Initialize();
float delta = glfwGetTime();
//RenderCircle();
RenderBird();
processInput(window);
//RenderScene(window);
// Swap the screen buffers
glfwSwapBuffers(window);
// Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions
glfwPollEvents();
}
// Terminate GLFW, clearing any resources allocated by GLFW.
glfwTerminate();
return EXIT_SUCCESS;
}
static void Initialize(void) {
glClearColor(1.0, 1.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
void RenderBird() {
// BODY (rounded teardrop via TRIANGLE_FAN)
float cx = -0.15f, cy = 0.1f, r = 0.3f;
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(cx+ xTransition, cy+ yTransition);
for (int i = 0; i <= 180; i++) {
float angle = i * 3.14159f / 180.0f;
float x = r * cos(angle);
float y = r * sin(angle);
glVertex2f(cx + x + xTransition, cy + y+ yTransition);
}
glEnd();
// HEAD (circle)
float hx = 0.2f, hy = 0.2f, hr = 0.15f;
glBegin(GL_TRIANGLE_FAN);
glVertex2f(hx+xTransition, hy+ yTransition);
for (int i = 0; i <= 360; i++) {
float angle = i * 3.14159f / 180.0f;
float x = hr * cos(angle);
float y = hr * sin(angle);
glVertex2f(hx + x + xTransition, hy + y+ yTransition);
}
glEnd();
// EYE (small white circle)
float ex = 0.27f, ey = 0.27f, er = 0.03f;
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(ex+ xTransition, ey + yTransition);
for (int i = 0; i <= 360; i++) {
float angle = i * 3.14159f / 180.0f;
float x = er * cos(angle);
float y = er * sin(angle);
glVertex2f(ex + x + xTransition, ey + y+ yTransition);
}
glEnd();
// WING (triangle)
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glVertex2f(-0.1f+ xTransition, 0.4f+ yTransition); //right
glVertex2f(-0.45f + xTransition, 0.6f+ yTransition); //wing tip
glVertex2f(-0.25f + xTransition, 0.3f+ yTransition); //left
glEnd();
//beak
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_TRIANGLES);
glVertex2f(0.44f+ xTransition, 0.2f+ yTransition); // tip
glVertex2f(0.34f+xTransition, 0.25f+ yTransition); // top corner (connected to head)
glVertex2f(0.34f + xTransition, 0.15f+ yTransition); // bottom corner (connected to head)
glEnd();
}
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS)
{
yTransition += 0.001;
}
//drawingNo = 1;
if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS)
{
yTransition -= 0.001;
}
//drawingNo = 2;
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS)
{
xTransition -= 0.001;
}
//drawingNo = 1;
if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS)
{
xTransition += 0.001;
}
}