summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/glsphere.cpp60
-rw-r--r--src/glsphere.h3
-rw-r--r--src/mmscene.cpp2
3 files changed, 54 insertions, 11 deletions
diff --git a/src/glsphere.cpp b/src/glsphere.cpp
index 1a40540..77cb7f7 100644
--- a/src/glsphere.cpp
+++ b/src/glsphere.cpp
@@ -3,8 +3,9 @@
GLSphere::GLSphere(double radius, int stacks, int slices)
: GLBody(radius)
{
- m_stacks = stacks;
- m_slices = slices;
+ // Force an even number
+ m_stacks = stacks / 2 * 2;
+ m_slices = slices / 2 * 2;
}
void GLSphere::makeSurface(QVector<GLPoint> *pointContainer,
@@ -17,31 +18,70 @@ void GLSphere::makeSurface(QVector<GLPoint> *pointContainer,
QVector3D northpol = v_Y;
QVector3D southpol = -v_Y;
- QVector3D point1;
- QVector3D point2;
+ QVector<QVector3D> firstPointRow = calculateRow(0);
+
+ QVector<QVector3D> sliceA = firstPointRow;
+ QVector<QVector3D> sliceB;
m_firstPoint = m_points->size();
for (int slice = 1; slice < m_slices; slice += 2)
{
+ sliceB = calculateRow(slice);
+
m_points->append(GLPoint(m_radius * northpol, northpol, t0, m_color));
- for (int stack = 1; stack < m_stacks; stack++)
+ for (int i = 0; i < m_stacks - 1; i++)
{
- point1 = calculatePoint(2 * M_PI * slice / m_slices, stack * M_PI / m_stacks);
- m_points->append(GLPoint(m_radius * point1, point1, t0, m_color));
-
- point2 = calculatePoint(2 * M_PI * (slice - 1) / m_slices, stack * M_PI / m_stacks);
- m_points->append(GLPoint(m_radius * point2, point2, t0, m_color));
+ m_points->append(GLPoint(m_radius * sliceA[i], sliceA[i],
+ t0, m_color));
+ m_points->append(GLPoint(m_radius * sliceB[i], sliceB[i],
+ t0, m_color));
}
m_points->append(GLPoint(m_radius * southpol, southpol, t0, m_color));
+
+ sliceA = calculateRow(slice + 1);
+
+ for (int i = m_stacks - 2; i >= 0; i--)
+ {
+ m_points->append(GLPoint(m_radius * sliceA[i], sliceA[i],
+ t0, m_color));
+
+ m_points->append(GLPoint(m_radius * sliceB[i], sliceB[i],
+ t0, m_color));
+ }
+
+ m_points->append(GLPoint(m_radius * northpol, northpol, t0, m_color));
}
m_nextPoint = m_points->size();
}
+QVector<QVector3D> GLSphere::calculateRow(int slice)
+{
+ if(slice == m_stacks)
+ {
+ return firstRow;
+ }
+
+ QVector<QVector3D> longitude;
+
+ for (int stack = 1; stack < m_stacks; stack++)
+ {
+ longitude.append(calculatePoint(2 * M_PI * slice / m_slices,
+ stack * M_PI / m_stacks));
+ }
+
+ if (slice == 0)
+ {
+ firstRow = longitude;
+ }
+
+ return longitude;
+}
+
QVector3D GLSphere::calculatePoint(double sliceRotation, double stackRotation)
{
double x = sin(stackRotation) * sin(sliceRotation);
diff --git a/src/glsphere.h b/src/glsphere.h
index 9aae032..f884117 100644
--- a/src/glsphere.h
+++ b/src/glsphere.h
@@ -22,8 +22,11 @@ private:
*/
QVector3D calculatePoint(double sliceRotation, double stackRotation);
+ QVector<QVector3D> calculateRow(int slice);
+
int m_stacks;
int m_slices;
+ QVector<QVector3D> firstRow;
};
#endif // GLSPHERE_H
diff --git a/src/mmscene.cpp b/src/mmscene.cpp
index f199563..8de2c87 100644
--- a/src/mmscene.cpp
+++ b/src/mmscene.cpp
@@ -96,7 +96,7 @@ void MMScene::createSphere()
{
m_sphere = new GLSphere();
- m_sphere->setDrawingMode(GL_POINTS);
+ m_sphere->setDrawingMode(GL_TRIANGLE_STRIP);
m_sphere->makeSurface(&m_points, &m_indices);
}