-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcube_public_drawelements_v4.cpp
More file actions
164 lines (133 loc) · 4.21 KB
/
cube_public_drawelements_v4.cpp
File metadata and controls
164 lines (133 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/* Rotating cube with color interpolation (with glDrawElements) */
/* Both normals and colors are assigned to the vertices */
/* Cube is centered at origin so (unnormalized) normals
are the same as the vertex values */
#include <ctime>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
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 normals[][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,1.0,1.0},{1.0,0.0,0.0},
{1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0},
{1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};
GLubyte cubeIndices[24] = {3,2,1,0, 2,3,7,6, 7,3,0,4, 1,2,6,5, 4,5,6,7, 0,1,5,4};
int WinID[] = {0,0};
void polygon(int a, int b, int c , int d)
{/* draw a polygon via list of vertices */
glBegin(GL_POLYGON);
glColor3fv(colors[a]);
glNormal3fv(normals[a]);
glVertex3fv(vertices[a]);
glColor3fv(colors[b]);
glNormal3fv(normals[b]);
glVertex3fv(vertices[b]);
glColor3fv(colors[c]);
glNormal3fv(normals[c]);
glVertex3fv(vertices[c]);
glColor3fv(colors[d]);
glNormal3fv(normals[d]);
glVertex3fv(vertices[d]);
glEnd();
}
void colorcube(void)
{/* map vertices to faces */
polygon(3,2,1,0); //Green
polygon(2,3,7,6); //R+G = Yellow
polygon(7,3,0,4); //B+G = Cyan
polygon(1,2,6,5); //Red
polygon(4,5,6,7); //Blue
polygon(0,1,5,4); //White
}
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(); //< Immediate mode: http://en.wikipedia.org/wiki/Immediate_mode
//glEnableClientState(GL_VERTEX_ARRAY);
//glEnableClientState(GL_COLOR_ARRAY);
//glEnableClientState(GL_NORMAL_ARRAY);
//// Draw with Polygon mode ////////
//for(int i=0; i<6; i++)
// glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_BYTE, &cubeIndices[4*i]);
//// Draw with Quads mode ////////
//glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, &cubeIndices[0]);
//glDisableClientState(GL_VERTEX_ARRAY);
//glDisableClientState(GL_COLOR_ARRAY);
//glDisableClientState(GL_NORMAL_ARRAY);
glFlush();
glutSwapBuffers();
}
void spinCube()
{
clock_t now = clock();
static clock_t lastTime = 0;
if((now - lastTime)/(float)CLOCKS_PER_SEC > (1.0f/60.0f)){ //<60fps
// Idle callback, spin cube 0.3 degrees about selected axis
theta[axis] += 2;
if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
glutPostRedisplay();
// Record current time for next time:
lastTime = now;
}
}
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);
}
void Init(void)
{
//Enable hidden--surface--removal////////////
glEnable(GL_DEPTH_TEST);
//glEnable(GL_CULL_FACE);
//glCullFace(GL_FRONT); //default: GL_BACK
glShadeModel(GL_FLAT); //use color or first point as color of polygon
//Added for glDrawElements
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(3, GL_FLOAT, 0, colors);
glNormalPointer(GL_FLOAT, 0, normals);
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
//Both double buffering and z buffer are needed
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowPosition(0,0);
glutInitWindowSize(500, 500);
WinID[0] = glutCreateWindow("colorcube");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutIdleFunc(spinCube);
glutMouseFunc(mouse);
Init();
glutMainLoop();
}