summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-08-26 15:15:32 +0100
committerJani Heikkinen <jani.heikkinen@qt.io>2016-10-10 05:41:30 +0000
commit2d191d97d36008c3e51071d347baa2acfde5fce3 (patch)
treecec920eb6c7230ca0b61e601ce64041eed6948aa
parentcdbe66008112620b5b7e6c747fe5fda9a7f67f28 (diff)
Add tangent attribute to torus geometry
Needed for any kind of normal mapping. Change-Id: Iddc6c648808622e472e6c7a5254aa6769c67f8c1 Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
-rw-r--r--src/extras/geometries/qtorusgeometry.cpp28
-rw-r--r--src/extras/geometries/qtorusgeometry_p.h1
2 files changed, 25 insertions, 4 deletions
diff --git a/src/extras/geometries/qtorusgeometry.cpp b/src/extras/geometries/qtorusgeometry.cpp
index 65367886f..bcfe420de 100644
--- a/src/extras/geometries/qtorusgeometry.cpp
+++ b/src/extras/geometries/qtorusgeometry.cpp
@@ -44,6 +44,7 @@
#include <Qt3DRender/qattribute.h>
#include <qmath.h>
#include <QVector3D>
+#include <QVector4D>
QT_BEGIN_NAMESPACE
@@ -58,8 +59,8 @@ QByteArray createTorusVertexData(double radius, double minorRadius,
{
const int nVerts = sides * (rings + 1);
QByteArray bufferBytes;
- // vec3 pos, vec2 texCoord, vec3 normal
- const quint32 elementSize = 3 + 2 + 3;
+ // vec3 pos, vec2 texCoord, vec3 normal, vec4 tangent
+ const quint32 elementSize = 3 + 2 + 3 + 4;
const quint32 stride = elementSize * sizeof(float);
bufferBytes.resize(stride * nVerts);
@@ -91,6 +92,13 @@ QByteArray createTorusVertexData(double radius, double minorRadius,
*fptr++ = n.x();
*fptr++ = n.y();
*fptr++ = n.z();
+
+ QVector4D t(-su, cu, 0.0f, 1.0f);
+ t.normalize();
+ *fptr++ = t.x();
+ *fptr++ = t.y();
+ *fptr++ = t.z();
+ *fptr++ = t.w();
}
}
@@ -200,6 +208,7 @@ QTorusGeometryPrivate::QTorusGeometryPrivate()
, m_positionAttribute(nullptr)
, m_normalAttribute(nullptr)
, m_texCoordAttribute(nullptr)
+ , m_tangentAttribute(nullptr)
, m_indexAttribute(nullptr)
, m_vertexBuffer(nullptr)
, m_indexBuffer(nullptr)
@@ -212,11 +221,12 @@ void QTorusGeometryPrivate::init()
m_positionAttribute = new QAttribute(q);
m_normalAttribute = new QAttribute(q);
m_texCoordAttribute = new QAttribute(q);
+ m_tangentAttribute = new QAttribute(q);
m_indexAttribute = new QAttribute(q);
m_vertexBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer, q);
m_indexBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::IndexBuffer, q);
- // vec3 pos, vec2 tex, vec3 normal
- const quint32 elementSize = 3 + 2 + 3;
+ // vec3 pos, vec2 tex, vec3 normal, vec4 tangent
+ const quint32 elementSize = 3 + 2 + 3 + 4;
const quint32 stride = elementSize * sizeof(float);
const int nVerts = (m_slices + 1) * (m_rings + 1);
const int faces = (m_slices * 2) * m_rings;
@@ -247,6 +257,15 @@ void QTorusGeometryPrivate::init()
m_normalAttribute->setByteOffset(5 * sizeof(float));
m_normalAttribute->setCount(nVerts);
+ m_tangentAttribute->setName(QAttribute::defaultTangentAttributeName());
+ m_tangentAttribute->setDataType(QAttribute::Float);
+ m_tangentAttribute->setDataSize(4);
+ m_tangentAttribute->setAttributeType(QAttribute::VertexAttribute);
+ m_tangentAttribute->setBuffer(m_vertexBuffer);
+ m_tangentAttribute->setByteStride(stride);
+ m_tangentAttribute->setByteOffset(8 * sizeof(float));
+ m_tangentAttribute->setCount(nVerts);
+
m_indexAttribute->setAttributeType(QAttribute::IndexAttribute);
m_indexAttribute->setDataType(QAttribute::UnsignedShort);
m_indexAttribute->setBuffer(m_indexBuffer);
@@ -259,6 +278,7 @@ void QTorusGeometryPrivate::init()
q->addAttribute(m_positionAttribute);
q->addAttribute(m_texCoordAttribute);
q->addAttribute(m_normalAttribute);
+ q->addAttribute(m_tangentAttribute);
q->addAttribute(m_indexAttribute);
}
diff --git a/src/extras/geometries/qtorusgeometry_p.h b/src/extras/geometries/qtorusgeometry_p.h
index b4bcbde9f..7506a95ac 100644
--- a/src/extras/geometries/qtorusgeometry_p.h
+++ b/src/extras/geometries/qtorusgeometry_p.h
@@ -77,6 +77,7 @@ public:
Qt3DRender::QAttribute *m_positionAttribute;
Qt3DRender::QAttribute *m_normalAttribute;
Qt3DRender::QAttribute *m_texCoordAttribute;
+ Qt3DRender::QAttribute *m_tangentAttribute;
Qt3DRender::QAttribute *m_indexAttribute;
Qt3DRender::QBuffer *m_vertexBuffer;
Qt3DRender::QBuffer *m_indexBuffer;