69 lines
1.4 KiB
C++
69 lines
1.4 KiB
C++
#include <cylinder.h>
|
|
#include <stdio.h>
|
|
|
|
|
|
void VertexBuf::push(GLfloat x, GLfloat y, GLfloat z, Color &c)
|
|
{
|
|
vertices[i] = x;
|
|
vertices[i+1] = y;
|
|
vertices[i+2] = z;
|
|
colors[i] = c.r;
|
|
colors[i+1] = c.g;
|
|
colors[i+2] = c.b;
|
|
i += 3;
|
|
}
|
|
|
|
|
|
void Cylinder::build_face(float z)
|
|
{
|
|
Color color(c);
|
|
for (unsigned j = 0; j < nb_fac; j++) {
|
|
vb.push(0, 0, z, color);
|
|
vb.push(cos(angle*j) * r, sin(angle*j) * r, z, color);
|
|
vb.push(cos(angle*(j+1)) * r, sin(angle*(j+1)) * r, z, color);
|
|
if (j % (nb_fac/4) == 0) {
|
|
if (j % (nb_fac/2) == 0) {
|
|
color.r *= .8;
|
|
color.g *= .8;
|
|
color.b *= .8;
|
|
}
|
|
else {
|
|
color = c;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Cylinder::build_faces()
|
|
{
|
|
build_face(-ep/2);
|
|
build_face(ep/2);
|
|
}
|
|
|
|
|
|
void Cylinder::build_side()
|
|
{
|
|
Color color(c.r*.7, c.g*.7, c.b*.7);
|
|
for (unsigned i = 0; i < nb_fac+1; i++) {
|
|
vb.push(cos(angle*i) * r, sin(angle*i) * r, -ep/2, color);
|
|
vb.push(cos(angle*i) * r, sin(angle*i) * r, ep/2, color);
|
|
}
|
|
}
|
|
|
|
|
|
void Cylinder::draw(QOpenGLFunctions &f, int pos, int col)
|
|
{
|
|
f.glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 0, vb.vertices);
|
|
f.glVertexAttribPointer(col, 3, GL_FLOAT, GL_FALSE, 0, vb.colors);
|
|
f.glEnableVertexAttribArray(pos);
|
|
f.glEnableVertexAttribArray(col);
|
|
f.glDrawArrays(GL_TRIANGLES, 0, face_size);
|
|
f.glDrawArrays(GL_TRIANGLES, face_size, face_size);
|
|
f.glDrawArrays(GL_QUAD_STRIP,
|
|
face_size * 2,
|
|
side_size);
|
|
f.glDisableVertexAttribArray(pos);
|
|
f.glDisableVertexAttribArray(col);
|
|
}
|