summaryrefslogtreecommitdiffstats
path: root/src/extras/geometries
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-10-21 14:45:18 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2016-11-15 12:42:06 +0000
commit88224cf1b27557e129574c30ce5d51b71d1168ff (patch)
tree1e736af12eeb5270a951935a7aca00bbefd41772 /src/extras/geometries
parent400d0ad437207765cb3150a7ef2a55fe32ed3b76 (diff)
Fix QCylinderGeometry generation
The cylinder geometry and index attributes didn't match the actual generated geometry and indexes, if vertices were updated from defaults. Change-Id: I5d631599dc1b0ead84a4e9d93c9cb18f056c7d8e Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/extras/geometries')
-rw-r--r--src/extras/geometries/qcylindergeometry.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/extras/geometries/qcylindergeometry.cpp b/src/extras/geometries/qcylindergeometry.cpp
index 136258162..f37fd0ddf 100644
--- a/src/extras/geometries/qcylindergeometry.cpp
+++ b/src/extras/geometries/qcylindergeometry.cpp
@@ -57,6 +57,17 @@ namespace Qt3DExtras {
namespace {
+int faceCount(int slices, int rings)
+{
+ return (slices * 2) * (rings - 1) // two tris per side, for each pair of adjacent rings
+ + slices * 2; // two caps
+}
+
+int vertexCount(int slices, int rings)
+{
+ return (slices + 1) * rings + 2 * (slices + 1) + 2;
+}
+
void createSidesVertices(float *&verticesPtr,
int rings,
int slices,
@@ -180,7 +191,7 @@ public:
QByteArray operator ()() Q_DECL_OVERRIDE
{
- const int verticesCount = (m_slices + 1) * m_rings + 2 * (m_slices + 1) + 2;
+ const int verticesCount = vertexCount(m_slices, m_rings);
// vec3 pos, vec2 texCoord, vec3 normal
const quint32 vertexSize = (3 + 2 + 3) * sizeof(float);
@@ -227,8 +238,7 @@ public:
QByteArray operator ()() Q_DECL_OVERRIDE
{
- const int facesCount = (m_slices * 2) * (m_rings - 1) // two tris per side, for each pair of adjacent rings
- + m_slices * 2; // two caps
+ const int facesCount = faceCount(m_slices, m_rings);
const int indicesCount = facesCount * 3;
const int indexSize = sizeof(quint16);
Q_ASSERT(indicesCount < 65536);
@@ -292,8 +302,8 @@ void QCylinderGeometryPrivate::init()
// vec3 pos, vec2 tex, vec3 normal
const quint32 elementSize = 3 + 2 + 3;
const quint32 stride = elementSize * sizeof(float);
- const int nVerts = (m_slices + 1) * m_rings + 2 * (m_slices + 1) + 2;
- const int faces = (m_slices * 2) * (m_rings - 1) + (m_slices * 2);
+ const int nVerts = vertexCount(m_slices, m_rings);
+ const int faces = faceCount(m_slices, m_rings);
m_positionAttribute->setName(QAttribute::defaultPositionAttributeName());
m_positionAttribute->setVertexBaseType(QAttribute::Float);
@@ -439,7 +449,7 @@ QCylinderGeometry::~QCylinderGeometry()
void QCylinderGeometry::updateVertices()
{
Q_D(QCylinderGeometry);
- const int nVerts = (d->m_slices + 1) * (d->m_rings + 1);
+ const int nVerts = vertexCount(d->m_slices, d->m_rings);
d->m_positionAttribute->setCount(nVerts);
d->m_texCoordAttribute->setCount(nVerts);
d->m_normalAttribute->setCount(nVerts);
@@ -453,7 +463,7 @@ void QCylinderGeometry::updateVertices()
void QCylinderGeometry::updateIndices()
{
Q_D(QCylinderGeometry);
- const int faces = (d->m_slices * 2) * (d->m_rings - 1) + (2 * d->m_slices);
+ const int faces = faceCount(d->m_slices, d->m_rings);
d->m_indexAttribute->setCount(faces * 3);
d->m_indexBuffer->setDataGenerator(QSharedPointer<CylinderIndexDataFunctor>::create(d->m_rings, d->m_slices, d->m_length));
}