#include "glcone.h" GLCone::GLCone(QVector3D lowerMiddlePoint, double lowerRadius, double upperRadius, double height, int sides, GLColorRgba color, QString textureFile) : GLDisc(lowerRadius, height, lowerMiddlePoint, sides, color, textureFile) { m_height = height; m_sides = sides; m_center = v_Z * 0.5 * m_height; m_circleRadius = lowerRadius; m_upperCircleRadius = upperRadius; m_lowerMiddlePoint = lowerMiddlePoint; } void GLCone::makeSurface(QVector *pointContainer, QVector *indexContainer) { GLBody::makeSurface(pointContainer, indexContainer); m_firstPoint = m_points->size(); m_points->append(GLPoint(v_Zero, -v_Z, QVector3D(0.5, 0.5, 0.0), m_color)); for (int side = 0; side < m_sides; side++) { QVector3D tmp = calculatePoint(side * 2 * M_PI / m_sides); QVector3D tmpTextCoo = (0.5 * tmp) + QVector3D(0.5, 0.5, 0.0); QVector3D topBarrel = QVector3D(m_upperCircleRadius * tmp .x(), m_upperCircleRadius * tmp .y(), m_height); QVector3D bottomBarrel = m_circleRadius * tmp; QVector3D tangent = QVector3D::crossProduct(bottomBarrel, v_Z); QVector3D barrelVector = topBarrel - bottomBarrel; QVector3D barrelNormal = QVector3D::crossProduct(barrelVector, tangent); m_points->append(GLPoint(bottomBarrel, -v_Z, tmpTextCoo, m_color)); m_points->append(GLPoint(bottomBarrel, barrelNormal, tmpTextCoo, m_color)); m_points->append(GLPoint(topBarrel, barrelNormal, tmpTextCoo, m_color)); m_points->append(GLPoint(topBarrel, v_Z, tmpTextCoo, m_color)); } m_points->append(GLPoint(m_height * v_Z, v_Z, QVector3D(0.5, 0.5, 0.0), m_color)); m_nextPoint = m_points->size(); m_firstIndex = m_indices->size(); for (int side = 0; side < m_sides - 1; side++) { m_indices->append(m_firstPoint); m_indices->append(m_firstPoint + 1 + 4 * side); m_indices->append(m_firstPoint + 5 + 4 * side); m_indices->append(m_firstPoint + 2 + 4 * side); m_indices->append(m_firstPoint + 6 + 4 * side); m_indices->append(m_firstPoint + 3 + 4 * side); m_indices->append(m_firstPoint + 3 + 4 * side); m_indices->append(m_firstPoint + 7 + 4 * side); m_indices->append(m_firstPoint + 6 + 4 * side); m_indices->append(m_firstPoint + 4 + 4 * side); m_indices->append(m_firstPoint + 8 + 4 * side); m_indices->append(m_nextPoint - 1); } m_indices->append(m_firstPoint); m_indices->append(m_firstPoint + 1 + 4 * (m_sides - 1)); m_indices->append(m_firstPoint + 1); m_indices->append(m_firstPoint + 2 + 4 * (m_sides - 1)); m_indices->append(m_firstPoint + 2); m_indices->append(m_firstPoint + 3 + 4 * (m_sides - 1)); m_indices->append(m_firstPoint + 3 + 4 * (m_sides - 1)); m_indices->append(m_firstPoint + 3); m_indices->append(m_firstPoint + 2); m_indices->append(m_firstPoint + 4 + 4 * (m_sides - 1)); m_indices->append(m_firstPoint + 4); m_indices->append(m_nextPoint - 1); m_nextIndex = m_indices->size(); } void GLCone::draw(GLESRenderer *renderer) { renderer->pushMvMatrix(); renderer->translate(m_lowerMiddlePoint); GLBody::draw(renderer); renderer->popMvMatrix(); }