blob: fc65d08544b3520bccf1681eaf331a6e5358e884 [file]
/****************************************************************************
**
** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt3D module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtTest/QTest>
#include <qbackendnodetester.h>
#include <Qt3DRender/qgeometryrenderer.h>
#include <Qt3DRender/qbuffer.h>
#include <private/segmentsvisitor_p.h>
#include <private/nodemanagers_p.h>
#include <private/managers_p.h>
#include <private/geometryrenderer_p.h>
#include <private/geometryrenderermanager_p.h>
#include <private/buffermanager_p.h>
#include "testrenderer.h"
using namespace Qt3DRender::Render;
class TestVisitor : public SegmentsVisitor
{
public:
TestVisitor(NodeManagers *manager)
: SegmentsVisitor(manager)
{
}
virtual void visit(uint andx, const Vector3D &a, uint bndx, const Vector3D &b)
{
m_segments.push_back(TestSegment(andx, a, bndx, b));
}
NodeManagers *nodeManagers() const
{
return m_manager;
}
Qt3DCore::QNodeId nodeId() const
{
return m_nodeId;
}
uint segmentCount() const
{
return m_segments.size();
}
bool verifySegment(uint segment, uint andx, uint bndx, Vector3D a, Vector3D b) const
{
if (segment >= uint(m_segments.size()))
return false;
if (andx != m_segments[segment].abcndx[0]
|| bndx != m_segments[segment].abcndx[1])
return false;
if (!qFuzzyCompare(a, m_segments[segment].abc[0])
|| !qFuzzyCompare(b, m_segments[segment].abc[1]))
return false;
return true;
}
private:
struct TestSegment
{
uint abcndx[2];
Vector3D abc[2];
TestSegment()
{
abcndx[0] = abcndx[1] = uint(-1);
}
TestSegment(uint andx, const Vector3D &a, uint bndx, const Vector3D &b)
{
abcndx[0] = andx;
abcndx[1] = bndx;
abc[0] = a;
abc[1] = b;
}
};
QVector<TestSegment> m_segments;
};
class tst_SegmentVisitor : public Qt3DCore::QBackendNodeTester
{
Q_OBJECT
private Q_SLOTS:
void checkInitialize()
{
// WHEN
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
TestVisitor visitor(nodeManagers.data());
// THEN
QCOMPARE(visitor.nodeManagers(), nodeManagers.data());
}
void checkApplyEntity()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
QScopedPointer<Qt3DCore::QEntity> entity(new Qt3DCore::QEntity());
TestVisitor visitor(nodeManagers.data());
// WHEN
visitor.apply(entity.data());
// THEN
QCOMPARE(visitor.nodeId(), entity->id());
QCOMPARE(visitor.segmentCount(), uint(0));
}
void checkApplyGeometryRenderer()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
QScopedPointer<GeometryRenderer> geometryRenderer(new GeometryRenderer());
TestVisitor visitor(nodeManagers.data());
// WHEN
visitor.apply(geometryRenderer.data(), Qt3DCore::QNodeId());
// THEN
// tadaa, nothing should happen
}
void testVisitSegments()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
QScopedPointer<Qt3DRender::QAttribute> positionAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QBuffer> dataBuffer(new Qt3DRender::QBuffer());
TestVisitor visitor(nodeManagers.data());
TestRenderer renderer;
QByteArray data;
data.resize(sizeof(float) * 3 * 2 * 3);
float *dataPtr = reinterpret_cast<float *>(data.data());
dataPtr[0] = 0;
dataPtr[1] = 0;
dataPtr[2] = 1.0f;
dataPtr[3] = 1.0f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 0;
dataPtr[7] = 1.0f;
dataPtr[8] = 0;
dataPtr[9] = 0;
dataPtr[10] = 0;
dataPtr[11] = 1.0f;
dataPtr[12] = 1.0f;
dataPtr[13] = 0;
dataPtr[14] = 0;
dataPtr[15] = 0;
dataPtr[16] = 1.0f;
dataPtr[17] = 0;
dataBuffer->setData(data);
Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id());
backendBuffer->setRenderer(&renderer);
backendBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(dataBuffer.data(), backendBuffer);
positionAttribute->setBuffer(dataBuffer.data());
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setCount(6);
positionAttribute->setByteStride(3*4);
positionAttribute->setByteOffset(0);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
geometry->addAttribute(positionAttribute.data());
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::Lines);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
simulateInitializationSync(positionAttribute.data(), backendAttribute);
Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id());
backendGeometry->setRenderer(&renderer);
simulateInitializationSync(geometry, backendGeometry);
GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id());
backendRenderer->setRenderer(&renderer);
backendRenderer->setManager(nodeManagers->geometryRendererManager());
simulateInitializationSync(geometryRenderer.data(), backendRenderer);
// WHEN
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
QCOMPARE(visitor.segmentCount(), uint(3));
QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,1), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(1, 2,3, Vector3D(0,1,0), Vector3D(0,0,1)));
QVERIFY(visitor.verifySegment(2, 4,5, Vector3D(1,0,0), Vector3D(0,1,0)));
}
void testVisitSegmentsIndexed()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
QScopedPointer<Qt3DRender::QAttribute> positionAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QAttribute> indexAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QBuffer> dataBuffer(new Qt3DRender::QBuffer());
QScopedPointer<Qt3DRender::QBuffer> indexDataBuffer(new Qt3DRender::QBuffer());
TestVisitor visitor(nodeManagers.data());
TestRenderer renderer;
QByteArray data;
data.resize(sizeof(float) * 3 * 4);
float *dataPtr = reinterpret_cast<float *>(data.data());
dataPtr[0] = 0;
dataPtr[1] = 0;
dataPtr[2] = 0.0f;
dataPtr[3] = 1.0f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.0;
dataPtr[7] = 1.0f;
dataPtr[8] = 0;
dataPtr[9] = 0;
dataPtr[10] = 1.0f;
dataPtr[11] = 0;
dataBuffer->setData(data);
Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id());
backendBuffer->setRenderer(&renderer);
backendBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(dataBuffer.data(), backendBuffer);
QByteArray indexData;
indexData.resize(sizeof(uint) * 2 * 5);
uint *iDataPtr = reinterpret_cast<uint *>(indexData.data());
iDataPtr[0] = 0;
iDataPtr[1] = 1;
iDataPtr[2] = 1;
iDataPtr[3] = 2;
iDataPtr[4] = 2;
iDataPtr[5] = 3;
iDataPtr[6] = 0;
iDataPtr[7] = 2;
iDataPtr[8] = 1;
iDataPtr[9] = 3;
indexDataBuffer->setData(indexData);
Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id());
backendIndexBuffer->setRenderer(&renderer);
backendIndexBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer);
positionAttribute->setBuffer(dataBuffer.data());
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setCount(4);
positionAttribute->setByteStride(3*sizeof(float));
positionAttribute->setByteOffset(0);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
indexAttribute->setBuffer(indexDataBuffer.data());
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
indexAttribute->setCount(2*5);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
geometry->addAttribute(positionAttribute.data());
geometry->addAttribute(indexAttribute.data());
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::Lines);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
simulateInitializationSync(positionAttribute.data(), backendAttribute);
Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id());
backendIndexAttribute->setRenderer(&renderer);
simulateInitializationSync(indexAttribute.data(), backendIndexAttribute);
Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id());
backendGeometry->setRenderer(&renderer);
simulateInitializationSync(geometry, backendGeometry);
GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id());
backendRenderer->setRenderer(&renderer);
backendRenderer->setManager(nodeManagers->geometryRendererManager());
simulateInitializationSync(geometryRenderer.data(), backendRenderer);
// WHEN
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
QCOMPARE(visitor.segmentCount(), uint(5));
QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0)));
QVERIFY(visitor.verifySegment(3, 0,2, Vector3D(0,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(4, 1,3, Vector3D(1,0,0), Vector3D(0,1,0)));
}
void testVisitLineStrip()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
QScopedPointer<Qt3DRender::QAttribute> positionAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QBuffer> dataBuffer(new Qt3DRender::QBuffer());
TestVisitor visitor(nodeManagers.data());
TestRenderer renderer;
QByteArray data;
data.resize(sizeof(float) * 3 * 4);
float *dataPtr = reinterpret_cast<float *>(data.data());
dataPtr[0] = 0;
dataPtr[1] = 0;
dataPtr[2] = 0.0f;
dataPtr[3] = 1.0f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.0f;
dataPtr[7] = 1.0f;
dataPtr[8] = 0;
dataPtr[9] = 0;
dataPtr[10] = 1.0f;
dataPtr[11] = 0;
dataBuffer->setData(data);
Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id());
backendBuffer->setRenderer(&renderer);
backendBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(dataBuffer.data(), backendBuffer);
positionAttribute->setBuffer(dataBuffer.data());
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setCount(4);
positionAttribute->setByteStride(3*4);
positionAttribute->setByteOffset(0);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
geometry->addAttribute(positionAttribute.data());
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineStrip);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
simulateInitializationSync(positionAttribute.data(), backendAttribute);
Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id());
backendGeometry->setRenderer(&renderer);
simulateInitializationSync(geometry, backendGeometry);
GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id());
backendRenderer->setRenderer(&renderer);
backendRenderer->setManager(nodeManagers->geometryRendererManager());
simulateInitializationSync(geometryRenderer.data(), backendRenderer);
// WHEN
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
QCOMPARE(visitor.segmentCount(), uint(3));
QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0)));
}
void testVisitListStripIndexed()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
QScopedPointer<Qt3DRender::QAttribute> positionAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QAttribute> indexAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QBuffer> dataBuffer(new Qt3DRender::QBuffer());
QScopedPointer<Qt3DRender::QBuffer> indexDataBuffer(new Qt3DRender::QBuffer());
TestVisitor visitor(nodeManagers.data());
TestRenderer renderer;
QByteArray data;
data.resize(sizeof(float) * 3 * 4);
float *dataPtr = reinterpret_cast<float *>(data.data());
dataPtr[0] = 0;
dataPtr[1] = 0;
dataPtr[2] = 0.0f;
dataPtr[3] = 1.0f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.0;
dataPtr[7] = 1.0f;
dataPtr[8] = 0;
dataPtr[9] = 0;
dataPtr[10] = 1.0f;
dataPtr[11] = 0;
dataBuffer->setData(data);
Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id());
backendBuffer->setRenderer(&renderer);
backendBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(dataBuffer.data(), backendBuffer);
QByteArray indexData;
indexData.resize(sizeof(uint) * 7);
uint *iDataPtr = reinterpret_cast<uint *>(indexData.data());
iDataPtr[0] = 0;
iDataPtr[1] = 1;
iDataPtr[2] = 2;
iDataPtr[3] = 3;
iDataPtr[4] = static_cast<uint>(-1);
iDataPtr[5] = 0;
iDataPtr[6] = 1;
indexDataBuffer->setData(indexData);
Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id());
backendIndexBuffer->setRenderer(&renderer);
backendIndexBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer);
positionAttribute->setBuffer(dataBuffer.data());
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setCount(4);
positionAttribute->setByteStride(3*sizeof(float));
positionAttribute->setByteOffset(0);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
indexAttribute->setBuffer(indexDataBuffer.data());
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
indexAttribute->setCount(7);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
geometry->addAttribute(positionAttribute.data());
geometry->addAttribute(indexAttribute.data());
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineStrip);
geometryRenderer->setPrimitiveRestartEnabled(true);
geometryRenderer->setRestartIndexValue(-1);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
simulateInitializationSync(positionAttribute.data(), backendAttribute);
Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id());
backendIndexAttribute->setRenderer(&renderer);
simulateInitializationSync(indexAttribute.data(), backendIndexAttribute);
Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id());
backendGeometry->setRenderer(&renderer);
simulateInitializationSync(geometry, backendGeometry);
GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id());
backendRenderer->setRenderer(&renderer);
backendRenderer->setManager(nodeManagers->geometryRendererManager());
simulateInitializationSync(geometryRenderer.data(), backendRenderer);
// WHEN
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
QCOMPARE(visitor.segmentCount(), uint(4));
QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0)));
QVERIFY(visitor.verifySegment(3, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
}
void testVisitLineLoop()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
QScopedPointer<Qt3DRender::QAttribute> positionAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QBuffer> dataBuffer(new Qt3DRender::QBuffer());
TestVisitor visitor(nodeManagers.data());
TestRenderer renderer;
QByteArray data;
data.resize(sizeof(float) * 3 * 4);
float *dataPtr = reinterpret_cast<float *>(data.data());
dataPtr[0] = 0;
dataPtr[1] = 0;
dataPtr[2] = 0.0f;
dataPtr[3] = 1.0f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.0f;
dataPtr[7] = 1.0f;
dataPtr[8] = 0;
dataPtr[9] = 0;
dataPtr[10] = 1.0f;
dataPtr[11] = 0;
dataBuffer->setData(data);
Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id());
backendBuffer->setRenderer(&renderer);
backendBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(dataBuffer.data(), backendBuffer);
positionAttribute->setBuffer(dataBuffer.data());
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setCount(4);
positionAttribute->setByteStride(3*4);
positionAttribute->setByteOffset(0);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
geometry->addAttribute(positionAttribute.data());
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineLoop);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
simulateInitializationSync(positionAttribute.data(), backendAttribute);
Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id());
backendGeometry->setRenderer(&renderer);
simulateInitializationSync(geometry, backendGeometry);
GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id());
backendRenderer->setRenderer(&renderer);
backendRenderer->setManager(nodeManagers->geometryRendererManager());
simulateInitializationSync(geometryRenderer.data(), backendRenderer);
// WHEN
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
QCOMPARE(visitor.segmentCount(), uint(4));
QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0)));
QVERIFY(visitor.verifySegment(3, 3,0, Vector3D(0,1,0), Vector3D(0,0,0)));
}
void testVisitLineLoopIndexed()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
QScopedPointer<Qt3DRender::QAttribute> positionAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QAttribute> indexAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QBuffer> dataBuffer(new Qt3DRender::QBuffer());
QScopedPointer<Qt3DRender::QBuffer> indexDataBuffer(new Qt3DRender::QBuffer());
TestVisitor visitor(nodeManagers.data());
TestRenderer renderer;
QByteArray data;
data.resize(sizeof(float) * 3 * 4);
float *dataPtr = reinterpret_cast<float *>(data.data());
dataPtr[0] = 0;
dataPtr[1] = 0;
dataPtr[2] = 0.0f;
dataPtr[3] = 1.0f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 1.0;
dataPtr[7] = 1.0f;
dataPtr[8] = 0;
dataPtr[9] = 0;
dataPtr[10] = 1.0f;
dataPtr[11] = 0;
dataBuffer->setData(data);
Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id());
backendBuffer->setRenderer(&renderer);
backendBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(dataBuffer.data(), backendBuffer);
QByteArray indexData;
indexData.resize(sizeof(uint) * 8);
uint *iDataPtr = reinterpret_cast<uint *>(indexData.data());
iDataPtr[0] = 0;
iDataPtr[1] = 1;
iDataPtr[2] = 2;
iDataPtr[3] = 3;
iDataPtr[4] = static_cast<uint>(-1);
iDataPtr[5] = 0;
iDataPtr[6] = 1;
iDataPtr[7] = 2;
indexDataBuffer->setData(indexData);
Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id());
backendIndexBuffer->setRenderer(&renderer);
backendIndexBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer);
positionAttribute->setBuffer(dataBuffer.data());
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setCount(4);
positionAttribute->setByteStride(3*sizeof(float));
positionAttribute->setByteOffset(0);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
indexAttribute->setBuffer(indexDataBuffer.data());
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
indexAttribute->setCount(8);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
geometry->addAttribute(positionAttribute.data());
geometry->addAttribute(indexAttribute.data());
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineLoop);
geometryRenderer->setPrimitiveRestartEnabled(true);
geometryRenderer->setRestartIndexValue(-1);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
simulateInitializationSync(positionAttribute.data(), backendAttribute);
Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id());
backendIndexAttribute->setRenderer(&renderer);
simulateInitializationSync(indexAttribute.data(), backendIndexAttribute);
Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id());
backendGeometry->setRenderer(&renderer);
simulateInitializationSync(geometry, backendGeometry);
GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id());
backendRenderer->setRenderer(&renderer);
backendRenderer->setManager(nodeManagers->geometryRendererManager());
simulateInitializationSync(geometryRenderer.data(), backendRenderer);
// WHEN
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
QCOMPARE(visitor.segmentCount(), uint(7));
QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0)));
QVERIFY(visitor.verifySegment(3, 3,0, Vector3D(0,1,0), Vector3D(0,0,0)));
QVERIFY(visitor.verifySegment(4, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(5, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(6, 2,0, Vector3D(1,1,0), Vector3D(0,0,0)));
}
void testVisitLineAdjacency()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
QScopedPointer<Qt3DRender::QAttribute> positionAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QBuffer> dataBuffer(new Qt3DRender::QBuffer());
TestVisitor visitor(nodeManagers.data());
TestRenderer renderer;
QByteArray data;
data.resize(sizeof(float) * 3 * 2 * 2);
float *dataPtr = reinterpret_cast<float *>(data.data());
dataPtr[0] = 0;
dataPtr[1] = 0;
dataPtr[2] = 1.0f;
dataPtr[3] = 1.0f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 0;
dataPtr[7] = 1.0f;
dataPtr[8] = 0;
dataPtr[9] = 1.0f;
dataPtr[10] = 0;
dataPtr[12] = 0;
dataBuffer->setData(data);
Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id());
backendBuffer->setRenderer(&renderer);
backendBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(dataBuffer.data(), backendBuffer);
positionAttribute->setBuffer(dataBuffer.data());
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setCount(4);
positionAttribute->setByteStride(3*4);
positionAttribute->setByteOffset(0);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
geometry->addAttribute(positionAttribute.data());
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LinesAdjacency);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
simulateInitializationSync(positionAttribute.data(), backendAttribute);
Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id());
backendGeometry->setRenderer(&renderer);
simulateInitializationSync(geometry, backendGeometry);
GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id());
backendRenderer->setRenderer(&renderer);
backendRenderer->setManager(nodeManagers->geometryRendererManager());
simulateInitializationSync(geometryRenderer.data(), backendRenderer);
// WHEN
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
QCOMPARE(visitor.segmentCount(), uint(1));
QVERIFY(visitor.verifySegment(0, 1, 2, Vector3D(1,0,0), Vector3D(0,1,0)));
}
void testVisitLinesAdjacencyIndexed()
{
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
QScopedPointer<Qt3DRender::QGeometryRenderer> geometryRenderer(new Qt3DRender::QGeometryRenderer());
QScopedPointer<Qt3DRender::QAttribute> positionAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QAttribute> indexAttribute(new Qt3DRender::QAttribute());
QScopedPointer<Qt3DRender::QBuffer> dataBuffer(new Qt3DRender::QBuffer());
QScopedPointer<Qt3DRender::QBuffer> indexDataBuffer(new Qt3DRender::QBuffer());
TestVisitor visitor(nodeManagers.data());
TestRenderer renderer;
QByteArray data;
data.resize(sizeof(float) * 3 * 2 * 2);
float *dataPtr = reinterpret_cast<float *>(data.data());
dataPtr[0] = 0;
dataPtr[1] = 0;
dataPtr[2] = 1.0f;
dataPtr[3] = 1.0f;
dataPtr[4] = 0;
dataPtr[5] = 0;
dataPtr[6] = 0;
dataPtr[7] = 1.0f;
dataPtr[8] = 0;
dataPtr[9] = 1.0f;
dataPtr[10] = 0;
dataPtr[12] = 0;
dataBuffer->setData(data);
Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id());
backendBuffer->setRenderer(&renderer);
backendBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(dataBuffer.data(), backendBuffer);
QByteArray indexData;
indexData.resize(sizeof(uint) * 4);
uint *iDataPtr = reinterpret_cast<uint *>(indexData.data());
iDataPtr[0] = 0;
iDataPtr[1] = 1;
iDataPtr[2] = 2;
iDataPtr[3] = 3;
indexDataBuffer->setData(indexData);
Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id());
backendIndexBuffer->setRenderer(&renderer);
backendIndexBuffer->setManager(nodeManagers->bufferManager());
simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer);
positionAttribute->setBuffer(dataBuffer.data());
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setCount(4);
positionAttribute->setByteStride(3*sizeof(float));
positionAttribute->setByteOffset(0);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
indexAttribute->setBuffer(indexDataBuffer.data());
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
indexAttribute->setCount(4);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
geometry->addAttribute(positionAttribute.data());
geometry->addAttribute(indexAttribute.data());
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LinesAdjacency);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
simulateInitializationSync(positionAttribute.data(), backendAttribute);
Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id());
backendIndexAttribute->setRenderer(&renderer);
simulateInitializationSync(indexAttribute.data(), backendIndexAttribute);
Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id());
backendGeometry->setRenderer(&renderer);
simulateInitializationSync(geometry, backendGeometry);
GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id());
backendRenderer->setRenderer(&renderer);
backendRenderer->setManager(nodeManagers->geometryRendererManager());
simulateInitializationSync(geometryRenderer.data(), backendRenderer);
// WHEN
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
QCOMPARE(visitor.segmentCount(), uint(1));
QVERIFY(visitor.verifySegment(0, 1, 2, Vector3D(1,0,0), Vector3D(0,1,0)));
}
};
QTEST_MAIN(tst_SegmentVisitor)
#include "tst_segmentvisitor.moc"