// Project.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define GLUT_DISABLE_ATEXIT_HACK
#include<windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include<GL/GLU.h>
#include <stdio.h>
#include <math.h>
#include<string>
#include<iostream>
#include<cstdlib>
#define eps 1e-3
using namespace std;
int cnt , f = -1 ;
GLfloat COLORS[6][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 1, 0, 1 }
, { 1, 1, 0 }, { 0, 0, 1 }, { 0, 1, 1 } };
GLfloat WHITE[] = { 0.0, 0.0, 0, 0 };
int done = 0;
void myStyleInit()
{
glClearColor(0.5, 0.5, 0.5, 1.0);//background color+ alpha object blending parameter
glPointSize(4.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-600, 600, -600, 600, 0, -1);
}
class Camera {
double theta;
double y;
double dTheta;
double dy;
public:
Camera() : theta(0), y(3), dTheta(0.04), dy(0.2) {}
double getX() { return 10 * cos(theta); }
double getY() { return y; }
double getZ() { return 10 * sin(theta); }
void moveRight() { theta += dTheta; }
void moveLeft() { theta -= dTheta; }
void moveUp() { y += dy; }
void moveDown() { if (y > dy) y -= dy; }
};
class Balloons {
double radius = 0.1 ;
GLfloat* color;
double y ;
int rand1;
double x ;
char c;
int idle = 1;
public:
Balloons() {
}
void create()
{
x = (double)(rand() % 2);
x *= f;
rand1 = (double)(rand() % 26);
c = 'a' + rand1 ;
}
void animate()
{
float xC = COLORS[cnt % 6][0], yC = COLORS[cnt % 6][1], zC = COLORS[cnt % 6][2];
while (fabs(y - 1.8) > eps)
{
y = y + 0.0005;
//cout << y << endl;
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(x, y, -4.0);
glColor3f(xC, yC, zC);
//glScalef(1.0, 1.0, 1.0);
glutSolidSphere(radius, 60, 60);
glColor3f(1.0, 1.0, 1.0);
glRasterPos3d(x, y,-4.0);
glColor3f(0.0f, 0.0f, 0.0f);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, c);
glFlush();
glutSwapBuffers();
}
}
int getIdle()
{
return idle;
}
void setIdle(int X)
{
idle = X;
}
void update(int X)
{
float xC = COLORS[X % 6][0], yC = COLORS[X % 6][1], zC = COLORS[X % 6][2];
if (!idle)
{
y += 0.001;
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(x, y, -4.0);
glColor3f(xC, yC, zC);
//glScalef(1.0, 1.0, 1.0);
glutSolidSphere(radius, 60, 60);
glColor3f(1.0, 1.0, 1.0);
glRasterPos3d(x, y, -4.0);
glColor3f(0.0f, 0.0f, 0.0f);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, c);
glutPostRedisplay();
glFlush();
glutSwapBuffers();
}
else
{
y = -1.6 + 0.001;
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(x, y, -4.0);
glColor3f(xC, yC, zC);
//glScalef(1.0, 1.0, 1.0);
glutSolidSphere(radius, 0, 0);
glColor3f(1.0, 1.0, 1.0);
glRasterPos3d(x, y, -4.0);
glColor3f(0.0f, 0.0f, 0.0f);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, c);
glutPostRedisplay();
glFlush();
glutSwapBuffers();
}
if (y > 1.8)
{
idle = 1;
y = -1.6;
}
}
};
Camera camera;
Balloons balloons[10];
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(camera.getX(), camera.getY(), camera.getZ(), 4 , 0.0, 4 , 0.0, 1.0, 0.0);
printf("x");
for (int i = 0; i < 10 ; i++)
{
cout << balloons[i].getIdle() <<" " << i << endl;
if (done && balloons[i].getIdle() )
{
balloons[i].create();
balloons[i].setIdle(0);
balloons[i].update(i);
done = 0;
}
else if ( !balloons[i].getIdle())
{
balloons[i].update(i);
}
//balloon.animate() ;
cnt++;
f = -f;
//cout << cnt << endl;
}
glFlush();
glutSwapBuffers();
}
void reshape(GLint w, GLint h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, GLfloat(w) / GLfloat(h), 1.0, 150.0);
glMatrixMode(GL_MODELVIEW);
}
void timer(int v) {
glutPostRedisplay();
glutTimerFunc(100, timer, v);
}
void special(int key, int, int) {
switch (key) {
case GLUT_KEY_LEFT: camera.moveLeft(); break;
case GLUT_KEY_RIGHT: camera.moveRight(); break;
case GLUT_KEY_UP: camera.moveUp(); break;
case GLUT_KEY_DOWN: camera.moveDown(); break;
}
glutPostRedisplay();
}
void keyboard(unsigned char ch, int x, int y)
{
if (ch == 'g') done = 1;
else if(ch == 's') done = 0;
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(600, 600);
glutInitWindowPosition(750, 50);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glClearColor(0.0, 0.0, 0.0, 0.0);
glutCreateWindow("Welcome this funky game");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutSpecialFunc(special);
myStyleInit();
glutTimerFunc(5, timer, 0);
glutMainLoop();
return 0;
}
Ly8gUHJvamVjdC5jcHAgOiBEZWZpbmVzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGNvbnNvbGUgYXBwbGljYXRpb24uCi8vCgojaW5jbHVkZSAic3RkYWZ4LmgiCiNkZWZpbmUgR0xVVF9ESVNBQkxFX0FURVhJVF9IQUNLCiNpbmNsdWRlPHdpbmRvd3MuaD4KI2luY2x1ZGUgPEdML2dsLmg+CiNpbmNsdWRlIDxHTC9nbHV0Lmg+CiNpbmNsdWRlPEdML0dMVS5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGU8c3RyaW5nPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8Y3N0ZGxpYj4KCgojZGVmaW5lIGVwcyAxZS0zIAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IGNudCAsIGYgPSAtMSA7IAoKR0xmbG9hdCBDT0xPUlNbNl1bM10gPSB7ICB7IDEsIDAsIDAgfSwgeyAwLCAxLCAwIH0sIHsgMSwgMCwgMSB9CiwgeyAxLCAxLCAwIH0sIHsgMCwgMCwgMSB9LCB7IDAsIDEsIDEgfSAgfTsgCgpHTGZsb2F0IFdISVRFW10gPSB7IDAuMCwgMC4wLCAwLCAwIH07IAoKCmludCBkb25lID0gMDsgCgp2b2lkIG15U3R5bGVJbml0KCkKewoJZ2xDbGVhckNvbG9yKDAuNSwgMC41LCAwLjUsIDEuMCk7Ly9iYWNrZ3JvdW5kIGNvbG9yKyBhbHBoYSBvYmplY3QgYmxlbmRpbmcgcGFyYW1ldGVyCglnbFBvaW50U2l6ZSg0LjApOwoJZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwoJZ2xMb2FkSWRlbnRpdHkoKTsKCWdsT3J0aG8oLTYwMCwgNjAwLCAtNjAwLCA2MDAsIDAsIC0xKTsKfQoKCmNsYXNzIENhbWVyYSB7Cglkb3VibGUgdGhldGE7ICAgICAgCglkb3VibGUgeTsgICAgICAgICAgCglkb3VibGUgZFRoZXRhOyAgICAKCWRvdWJsZSBkeTsgICAgICAgICAKcHVibGljOgoJQ2FtZXJhKCkgOiB0aGV0YSgwKSwgeSgzKSwgZFRoZXRhKDAuMDQpLCBkeSgwLjIpIHt9Cglkb3VibGUgZ2V0WCgpIHsgcmV0dXJuIDEwICogY29zKHRoZXRhKTsgfQoJZG91YmxlIGdldFkoKSB7IHJldHVybiB5OyB9Cglkb3VibGUgZ2V0WigpIHsgcmV0dXJuIDEwICogc2luKHRoZXRhKTsgfQoJdm9pZCBtb3ZlUmlnaHQoKSB7IHRoZXRhICs9IGRUaGV0YTsgfQoJdm9pZCBtb3ZlTGVmdCgpIHsgdGhldGEgLT0gZFRoZXRhOyB9Cgl2b2lkIG1vdmVVcCgpIHsgeSArPSBkeTsgfQoJdm9pZCBtb3ZlRG93bigpIHsgaWYgKHkgPiBkeSkgeSAtPSBkeTsgfQp9OwoKY2xhc3MgQmFsbG9vbnMgewoJZG91YmxlIHJhZGl1cyA9IDAuMSA7CglHTGZsb2F0KiBjb2xvcjsKCWRvdWJsZSB5ICA7CglpbnQgcmFuZDE7ICAKCWRvdWJsZSB4ICA7IAoJY2hhciBjOyAKCWludCBpZGxlID0gMTsgCgkJCnB1YmxpYzoKCUJhbGxvb25zKCkgewoJfQoJdm9pZCBjcmVhdGUoKQoJewoJCXggPSAoZG91YmxlKShyYW5kKCkgJSAyKTsKCQl4ICo9IGY7IAoJCXJhbmQxID0gKGRvdWJsZSkocmFuZCgpICUgMjYpOwoJCWMgPSAnYScgKyByYW5kMSA7IAoJfQoJdm9pZCBhbmltYXRlKCkKCXsKCQlmbG9hdCB4QyA9IENPTE9SU1tjbnQgJSA2XVswXSwgeUMgPSBDT0xPUlNbY250ICUgNl1bMV0sIHpDID0gQ09MT1JTW2NudCAlIDZdWzJdOwoJCQoJCXdoaWxlIChmYWJzKHkgLSAxLjgpID4gZXBzKQoJCXsKCQkJeSA9IHkgKyAwLjAwMDU7IAoJCQkvL2NvdXQgPDwgeSA8PCBlbmRsOyAKCQkJZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CgkJCWdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CgkJCWdsTG9hZElkZW50aXR5KCk7CgkJCWdsVHJhbnNsYXRlZih4LCB5LCAtNC4wKTsKCQkJZ2xDb2xvcjNmKHhDLCB5QywgekMpOwoJCQkvL2dsU2NhbGVmKDEuMCwgMS4wLCAxLjApOwoJCQlnbHV0U29saWRTcGhlcmUocmFkaXVzLCA2MCwgNjApOwoJCQlnbENvbG9yM2YoMS4wLCAxLjAsIDEuMCk7CgkJCWdsUmFzdGVyUG9zM2QoeCwgeSwtNC4wKTsKCQkJZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDAuMGYpOwoJCQlnbHV0Qml0bWFwQ2hhcmFjdGVyKEdMVVRfQklUTUFQX1RJTUVTX1JPTUFOXzI0LCBjKTsKCgkJCWdsRmx1c2goKTsKCQkJZ2x1dFN3YXBCdWZmZXJzKCk7CgkJfQoJfQoKCWludCBnZXRJZGxlKCkKCXsKCQlyZXR1cm4gaWRsZTsgCgl9Cgl2b2lkIHNldElkbGUoaW50IFgpCgl7CgkJaWRsZSA9IFg7IAoJfQoKCXZvaWQgdXBkYXRlKGludCBYKQoJewoJCWZsb2F0IHhDID0gQ09MT1JTW1ggJSA2XVswXSwgeUMgPSBDT0xPUlNbWCAlIDZdWzFdLCB6QyA9IENPTE9SU1tYICUgNl1bMl07CgkJaWYgKCFpZGxlKQoJCXsKCQkJeSArPSAwLjAwMTsgCgkJCWdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwoJCQlnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwoJCQlnbExvYWRJZGVudGl0eSgpOwoJCQlnbFRyYW5zbGF0ZWYoeCwgeSwgLTQuMCk7CgkJCWdsQ29sb3IzZih4QywgeUMsIHpDKTsKCQkJLy9nbFNjYWxlZigxLjAsIDEuMCwgMS4wKTsKCQkJZ2x1dFNvbGlkU3BoZXJlKHJhZGl1cywgNjAsIDYwKTsKCQkJZ2xDb2xvcjNmKDEuMCwgMS4wLCAxLjApOwoJCQlnbFJhc3RlclBvczNkKHgsIHksIC00LjApOwoJCQlnbENvbG9yM2YoMC4wZiwgMC4wZiwgMC4wZik7CgkJCWdsdXRCaXRtYXBDaGFyYWN0ZXIoR0xVVF9CSVRNQVBfVElNRVNfUk9NQU5fMjQsIGMpOwoJCQlnbHV0UG9zdFJlZGlzcGxheSgpOwoKCgkJCWdsRmx1c2goKTsKCQkJZ2x1dFN3YXBCdWZmZXJzKCk7CgkJfQoJCWVsc2UKCQl7CgkJCXkgPSAtMS42ICsgMC4wMDE7IAoJCQlnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKCQkJZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKCQkJZ2xMb2FkSWRlbnRpdHkoKTsKCQkJZ2xUcmFuc2xhdGVmKHgsIHksIC00LjApOwoJCQlnbENvbG9yM2YoeEMsIHlDLCB6Qyk7CgkJCS8vZ2xTY2FsZWYoMS4wLCAxLjAsIDEuMCk7CgkJCWdsdXRTb2xpZFNwaGVyZShyYWRpdXMsIDAsIDApOwoJCQlnbENvbG9yM2YoMS4wLCAxLjAsIDEuMCk7CgkJCWdsUmFzdGVyUG9zM2QoeCwgeSwgLTQuMCk7CgkJCWdsQ29sb3IzZigwLjBmLCAwLjBmLCAwLjBmKTsKCQkJZ2x1dEJpdG1hcENoYXJhY3RlcihHTFVUX0JJVE1BUF9USU1FU19ST01BTl8yNCwgYyk7CgoJCQlnbHV0UG9zdFJlZGlzcGxheSgpOwoKCQkJZ2xGbHVzaCgpOwoJCQlnbHV0U3dhcEJ1ZmZlcnMoKTsKCQl9CgoJCWlmICh5ID4gMS44KQoJCXsKCQkJaWRsZSA9IDE7CgkJCXkgPSAtMS42OyAKCQl9CgkJCQoKCX0KCgp9OwoKQ2FtZXJhIGNhbWVyYTsKQmFsbG9vbnMgYmFsbG9vbnNbMTBdOyAKCnZvaWQgZGlzcGxheSgpCnsKCWdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOwoJZ2xMb2FkSWRlbnRpdHkoKTsKCWdsdUxvb2tBdChjYW1lcmEuZ2V0WCgpLCBjYW1lcmEuZ2V0WSgpLCBjYW1lcmEuZ2V0WigpLCAgNCAgLCAwLjAsIDQgICwgMC4wLCAxLjAsIDAuMCk7CglwcmludGYoIngiKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgMTAgOyBpKyspCgl7CgkJY291dCA8PCBiYWxsb29uc1tpXS5nZXRJZGxlKCkgPDwiICIgPDwgaSAgPDwgZW5kbDsgCgkJaWYgKGRvbmUgJiYgYmFsbG9vbnNbaV0uZ2V0SWRsZSgpICkKCQl7CgkJCWJhbGxvb25zW2ldLmNyZWF0ZSgpOyAKCQkJYmFsbG9vbnNbaV0uc2V0SWRsZSgwKTsgCgkJCWJhbGxvb25zW2ldLnVwZGF0ZShpKTsgCgkJCWRvbmUgPSAwOyAKCQl9CgkJZWxzZSBpZiAoICFiYWxsb29uc1tpXS5nZXRJZGxlKCkpCgkJewoJCQliYWxsb29uc1tpXS51cGRhdGUoaSk7CgkJfQkKCQkvL2JhbGxvb24uYW5pbWF0ZSgpIDsgCgkJY250Kys7IAoJCWYgPSAtZjsgCgkJLy9jb3V0IDw8IGNudCA8PCBlbmRsOwoJfQoJZ2xGbHVzaCgpOwoJZ2x1dFN3YXBCdWZmZXJzKCk7Cn0KCgoKdm9pZCByZXNoYXBlKEdMaW50IHcsIEdMaW50IGgpIHsKCWdsVmlld3BvcnQoMCwgMCwgdywgaCk7CglnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CglnbExvYWRJZGVudGl0eSgpOwoJZ2x1UGVyc3BlY3RpdmUoNDAuMCwgR0xmbG9hdCh3KSAvIEdMZmxvYXQoaCksIDEuMCwgMTUwLjApOwoJZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Cn0KCnZvaWQgdGltZXIoaW50IHYpIHsKCWdsdXRQb3N0UmVkaXNwbGF5KCk7CglnbHV0VGltZXJGdW5jKDEwMCwgdGltZXIsIHYpOwp9Cgp2b2lkIHNwZWNpYWwoaW50IGtleSwgaW50LCBpbnQpIHsKCXN3aXRjaCAoa2V5KSB7CgljYXNlIEdMVVRfS0VZX0xFRlQ6IGNhbWVyYS5tb3ZlTGVmdCgpOyBicmVhazsKCWNhc2UgR0xVVF9LRVlfUklHSFQ6IGNhbWVyYS5tb3ZlUmlnaHQoKTsgYnJlYWs7CgljYXNlIEdMVVRfS0VZX1VQOiBjYW1lcmEubW92ZVVwKCk7IGJyZWFrOwoJY2FzZSBHTFVUX0tFWV9ET1dOOiBjYW1lcmEubW92ZURvd24oKTsgYnJlYWs7Cgl9CglnbHV0UG9zdFJlZGlzcGxheSgpOwp9CgoKdm9pZCBrZXlib2FyZCh1bnNpZ25lZCBjaGFyIGNoLCBpbnQgeCwgaW50IHkpCnsKCWlmIChjaCA9PSAnZycpIGRvbmUgPSAxOwoJZWxzZSBpZihjaCA9PSAncycpIGRvbmUgPSAwOwp9CgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQp7CglnbHV0SW5pdCgmYXJnYywgYXJndik7CglnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfU0lOR0xFIHwgR0xVVF9SR0IpOwoJZ2x1dEluaXRXaW5kb3dTaXplKDYwMCwgNjAwKTsKCWdsdXRJbml0V2luZG93UG9zaXRpb24oNzUwLCA1MCk7CglnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9MSU5FKTsKCWdsQ2xlYXJDb2xvcigwLjAsIDAuMCwgMC4wLCAwLjApOwoJZ2x1dENyZWF0ZVdpbmRvdygiV2VsY29tZSB0aGlzIGZ1bmt5IGdhbWUiKTsKCWdsdXREaXNwbGF5RnVuYyhkaXNwbGF5KTsKCWdsdXRSZXNoYXBlRnVuYyhyZXNoYXBlKTsKCWdsdXRLZXlib2FyZEZ1bmMoa2V5Ym9hcmQpOwoJZ2x1dFNwZWNpYWxGdW5jKHNwZWNpYWwpOwoJbXlTdHlsZUluaXQoKTsgCglnbHV0VGltZXJGdW5jKDUsIHRpbWVyLCAwKTsKCWdsdXRNYWluTG9vcCgpOwoJcmV0dXJuIDA7Cn0K