Created
September 23, 2015 08:07
-
-
Save bitbrain/578edb6baa27f829834c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Rotating cube with color interpolation */ | |
#include <stdlib.h> | |
#ifdef __APPLE__ | |
#include <GLUT/glut.h> | |
#else | |
#include <GL/glut.h> | |
#endif | |
#include "lodepng.h" | |
#include <vector> | |
#include <string> | |
#include <iostream> | |
GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, | |
{1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, | |
{1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}}; | |
GLfloat colors[][3] = {{1.0,0.0,0.0},{0.0,1.0,0.0}, | |
{0.0,0.0,1.0}, {1.0,1.0,0.0}, {0.0,1.0,1.0}, | |
{1.0,0.0,1.0}}; | |
struct Image | |
{ | |
unsigned int width, height; | |
std::vector<unsigned char> data; | |
std::string url; | |
unsigned int load() | |
{ | |
unsigned int error = lodepng::decode(this->data, this->width, this->height, this->url.c_str()); | |
return error; | |
} | |
void draw() | |
{ | |
glEnable(GL_TEXTURE_2D); | |
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //GL_NEAREST = no smoothing | |
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
glTexImage2D(GL_TEXTURE_2D, 0, 4, this->width, this->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &this->data[0]); | |
} | |
}; | |
Image images[2]; | |
void loadTextures() | |
{ | |
images[0].url = "avatar.png"; | |
std::cout << images[0].load() << std::endl; | |
images[1].url = "1gam.png"; | |
std::cout << images[1].load() << std::endl; | |
} | |
void polygon(int a, int b, int c , int d) | |
{ | |
/* draw a polygon via list of vertices */ | |
glBegin(GL_POLYGON); | |
glTexCoord2d( 0, 0); | |
glVertex3fv(vertices[a]); | |
glTexCoord2d( 1, 0); | |
glVertex3fv(vertices[b]); | |
glTexCoord2d( 1, 1); | |
glVertex3fv(vertices[c]); | |
glTexCoord2d( 0, 1); | |
glVertex3fv(vertices[d]); | |
glEnd(); | |
} | |
void colorcube(void) | |
{ | |
/* map vertices to faces */ | |
glColor3fv(colors[0]); | |
images[0].draw(); | |
polygon(0,3,2,1); | |
glColor3fv(colors[1]); | |
polygon(2,3,7,6); | |
images[1].draw(); | |
glColor3fv(colors[2]); | |
polygon(3,0,4,7); | |
images[0].draw(); | |
glColor3fv(colors[3]); | |
polygon(1,2,6,5); | |
glColor3fv(colors[4]); | |
polygon(4,5,6,7); | |
images[1].draw(); | |
glColor3fv(colors[5]); | |
polygon(5,4,0,1); | |
} | |
static GLfloat theta[] = {0.0,0.0,0.0}; | |
static GLint axis = 2; | |
void display(void) | |
{ | |
/* display callback, clear frame buffer and z buffer, | |
rotate cube and draw, swap buffers */ | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
glLoadIdentity(); | |
glRotatef(theta[0], 1.0, 0.0, 0.0); | |
glRotatef(theta[1], 0.0, 1.0, 0.0); | |
glRotatef(theta[2], 0.0, 0.0, 1.0); | |
colorcube(); | |
glFlush(); | |
glutSwapBuffers(); | |
} | |
void spinCube() | |
{ | |
/* Idle callback, spin cube 2 degrees about selected axis */ | |
theta[axis] += 2.0; | |
if( theta[axis] > 360.0 ) theta[axis] -= 360.0; | |
/* display(); */ | |
glutPostRedisplay(); | |
} | |
void mouse(int btn, int state, int x, int y) | |
{ | |
/* mouse callback, selects an axis about which to rotate */ | |
if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0; | |
if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1; | |
if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2; | |
} | |
void myReshape(int w, int h) | |
{ | |
glViewport(0, 0, w, h); | |
glMatrixMode(GL_PROJECTION); | |
glLoadIdentity(); | |
if (w <= h) | |
glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w, | |
2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); | |
else | |
glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, | |
2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0); | |
glMatrixMode(GL_MODELVIEW); | |
} | |
int main(int argc, char **argv) | |
{ | |
glutInit(&argc, argv); | |
/* need both double buffering and z buffer */ | |
loadTextures(); | |
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); | |
glutInitWindowSize(500, 500); | |
glutCreateWindow("colorcube"); | |
glutReshapeFunc(myReshape); | |
glutDisplayFunc(display); | |
glutIdleFunc(spinCube); | |
glutMouseFunc(mouse); | |
glEnable(GL_DEPTH_TEST); /* Enable hidden--surface--removal */ | |
glutMainLoop(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment