blob: 1ffec30aed3c175469331e6bdb610655bdf0952a [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 Paul Lemire
** 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 <Qt3DCore/qentity.h>
#include <Qt3DRender/private/nodemanagers_p.h>
#include <Qt3DRender/private/managers_p.h>
#include <Qt3DRender/private/entity_p.h>
#include <Qt3DRender/private/filterlayerentityjob_p.h>
#include <Qt3DRender/private/updateentitylayersjob_p.h>
#include <Qt3DRender/private/updatetreeenabledjob_p.h>
#include <Qt3DRender/qlayer.h>
#include <Qt3DRender/qlayerfilter.h>
#include "testaspect.h"
class tst_LayerFiltering : public QObject
{
Q_OBJECT
private Q_SLOTS:
void checkInitialState()
{
// GIVEN
Qt3DRender::Render::FilterLayerEntityJob filterJob;
Qt3DRender::Render::UpdateEntityLayersJob updateEntityLayerJob;
Qt3DRender::QLayer frontendLayer;
// THEN
QVERIFY(updateEntityLayerJob.manager() == nullptr);
QCOMPARE(filterJob.hasLayerFilter(), false);
QCOMPARE(filterJob.filteredEntities().size(), 0);
QCOMPARE(filterJob.layerFilters().size(), 0);
QCOMPARE(frontendLayer.recursive(), false);
}
void filterEntities_data()
{
QTest::addColumn<Qt3DCore::QEntity *>("entitySubtree");
QTest::addColumn<Qt3DCore::QNodeIdVector>("layerFilterIds");
QTest::addColumn<Qt3DCore::QNodeIdVector>("expectedSelectedEntities");
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Q_UNUSED(childEntity1);
Q_UNUSED(childEntity2);
Q_UNUSED(childEntity3);
QTest::newRow("EntitiesNoLayerNoLayerFilterNoDiscardNoRecursive-ShouldSelectAll") << rootEntity
<< Qt3DCore::QNodeIdVector()
<< (Qt3DCore::QNodeIdVector()
<< rootEntity->id()
<< childEntity1->id()
<< childEntity2->id()
<< childEntity3->id()
);
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
Q_UNUSED(childEntity1);
Q_UNUSED(childEntity2);
Q_UNUSED(childEntity3);
QTest::newRow("EntityNoLayerWithLayerFilterWithNoFilter-ShouldSelectNone") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< Qt3DCore::QNodeIdVector();
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Q_UNUSED(childEntity1);
Q_UNUSED(childEntity2);
Q_UNUSED(childEntity3);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->addLayer(layer);
QTest::newRow("AcceptAny-NoLayerWithLayerFilterWithFilter-ShouldSelectNone") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< Qt3DCore::QNodeIdVector();
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
childEntity1->addComponent(layer);
childEntity2->addComponent(layer);
childEntity3->addComponent(layer);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->addLayer(layer);
QTest::newRow("AcceptAny-LayerWithLayerFilterWithFilter-ShouldSelectAllButRoot") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector() << childEntity1->id() << childEntity2->id() << childEntity3->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Q_UNUSED(childEntity1)
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
childEntity2->addComponent(layer2);
childEntity3->addComponent(layer);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->addLayer(layer);
layerFilter->addLayer(layer2);
QTest::newRow("AcceptAny-LayerWithLayerFilterWithFilter-ShouldSelectChild2And3") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector() << childEntity2->id() << childEntity3->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
childEntity1->addComponent(layer);
childEntity2->addComponent(layer);
childEntity3->addComponent(layer);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->addLayer(layer2);
QTest::newRow("AcceptAny-LayerWithLayerFilterWithFilter-ShouldSelectNone") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< Qt3DCore::QNodeIdVector();
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
childEntity1->setEnabled(false);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
childEntity1->addComponent(layer);
childEntity2->addComponent(layer);
childEntity3->addComponent(layer);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->addLayer(layer);
QTest::newRow("AcceptAny-LayerWithEntityDisabled-ShouldSelectOnlyEntityEnabled") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector() << childEntity2->id() << childEntity3->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
layer->setRecursive(true);
rootEntity->addComponent(layer);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->addLayer(layer);
QTest::newRow("AcceptAny-RecursiveLayerOnRoot-ShouldSelectAll") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< rootEntity->id()
<< childEntity1->id()
<< childEntity2->id()
<< childEntity3->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Q_UNUSED(childEntity1);
Q_UNUSED(childEntity2);
Q_UNUSED(childEntity3);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
layer->setRecursive(true);
rootEntity->addComponent(layer);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers);
layerFilter->addLayer(layer);
QTest::newRow("DiscardAny-RecursiveLayerLayerFilterDiscardOnRoot-ShouldSelectNone") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers);
layerFilter->addLayer(layer);
QTest::newRow("DiscardAny-LayerLayerFilterDiscardOnRoot-ShouldSelectAllButRoot") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< childEntity1->id()
<< childEntity2->id()
<< childEntity3->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer2);
childEntity2->addComponent(layer3);
childEntity3->addComponent(layer2);
childEntity3->addComponent(layer3);
childEntity3->addComponent(layer);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers);
layerFilter->addLayer(layer2);
layerFilter->addLayer(layer3);
QTest::newRow("DiscardAny-LayerLayerFilterDiscardOnRoot-ShouldSelectRoot") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< rootEntity->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer3);
childEntity1->addComponent(layer2);
childEntity2->addComponent(layer);
childEntity2->addComponent(layer3);
childEntity3->addComponent(layer);
childEntity3->addComponent(layer2);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::AcceptAllMatchingLayers);
layerFilter->addLayer(layer2);
layerFilter->addLayer(layer3);
QTest::newRow("AcceptAll-LayerFilterWith2LayersNonRecursive-ShouldSelectChild1") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< childEntity1->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
layer->setRecursive(true);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer3);
childEntity1->addComponent(layer2);
childEntity2->addComponent(layer3);
childEntity3->addComponent(layer2);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::AcceptAllMatchingLayers);
layerFilter->addLayer(layer);
layerFilter->addLayer(layer3);
QTest::newRow("AcceptAll-LayerFilterWith2LayersRecursive-ShouldSelectChild12") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< childEntity1->id()
<< childEntity2->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
layer->setRecursive(true);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer3);
childEntity1->addComponent(layer2);
childEntity2->addComponent(layer);
childEntity2->addComponent(layer3);
childEntity3->addComponent(layer2);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::AcceptAllMatchingLayers);
layerFilter->addLayer(layer);
layerFilter->addLayer(layer3);
QTest::newRow("AcceptAll-LayerFilterWith2LayersRecursiveAndDirectReferenceToRecursiveLayer-ShouldSelectChild12") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< childEntity1->id()
<< childEntity2->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer);
childEntity1->addComponent(layer2);
childEntity2->addComponent(layer);
childEntity2->addComponent(layer3);
childEntity3->addComponent(layer2);
childEntity3->addComponent(layer3);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::DiscardAllMatchingLayers);
layerFilter->addLayer(layer2);
layerFilter->addLayer(layer3);
QTest::newRow("DiscardAll-LayerFilterWith2Layers-ShouldSelectRootAndChild12") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< rootEntity->id()
<< childEntity1->id()
<< childEntity2->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
layer->setRecursive(true);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer2);
childEntity2->addComponent(layer3);
childEntity3->addComponent(layer3);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::DiscardAllMatchingLayers);
layerFilter->addLayer(layer);
layerFilter->addLayer(layer3);
QTest::newRow("DiscardAll-LayerFilterWith2LayersRecursive-ShouldSelectRootAndChild1") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< rootEntity->id()
<< childEntity1->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
layer->setRecursive(true);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer2);
childEntity1->addComponent(layer);
childEntity2->addComponent(layer3);
childEntity3->addComponent(layer3);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::DiscardAllMatchingLayers);
layerFilter->addLayer(layer);
layerFilter->addLayer(layer3);
QTest::newRow("DiscardAll-LayerFilterWith2LayersRecursiveAndDirectReference-ShouldSelectRootAndChild1") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< rootEntity->id()
<< childEntity1->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
layer->setRecursive(true);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer4 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer5 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer2);
childEntity1->addComponent(layer3);
childEntity2->addComponent(layer2);
childEntity2->addComponent(layer3);
childEntity2->addComponent(layer4);
childEntity2->addComponent(layer5);
childEntity3->addComponent(layer2);
childEntity3->addComponent(layer3);
childEntity3->addComponent(layer5);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::AcceptAllMatchingLayers);
layerFilter->addLayer(layer);
layerFilter->addLayer(layer2);
layerFilter->addLayer(layer3);
Qt3DRender::QLayerFilter *layerFilter2 = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter2->setFilterMode(Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers);
layerFilter2->addLayer(layer4);
layerFilter2->addLayer(layer5);
QTest::newRow("NestedFiltering-SelectAllOfLayer123AndNoneOf45-ShouldChild1") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id() << layerFilter2->id())
<< (Qt3DCore::QNodeIdVector()
<< childEntity1->id());
}
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity4 = new Qt3DCore::QEntity(rootEntity);
Qt3DCore::QEntity *childEntity5 = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer(rootEntity);
layer->setRecursive(true);
Qt3DRender::QLayer *layer2 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer3 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer4 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer5 = new Qt3DRender::QLayer(rootEntity);
Qt3DRender::QLayer *layer6 = new Qt3DRender::QLayer(rootEntity);
rootEntity->addComponent(layer);
childEntity1->addComponent(layer2);
childEntity1->addComponent(layer3);
childEntity2->addComponent(layer2);
childEntity2->addComponent(layer3);
childEntity2->addComponent(layer4);
childEntity2->addComponent(layer5);
childEntity3->addComponent(layer2);
childEntity3->addComponent(layer5);
childEntity4->addComponent(layer2);
childEntity4->addComponent(layer);
childEntity4->addComponent(layer3);
childEntity4->addComponent(layer6);
childEntity5->addComponent(layer3);
childEntity5->addComponent(layer4);
childEntity5->addComponent(layer6);
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter->setFilterMode(Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers);
layerFilter->addLayer(layer5);
layerFilter->addLayer(layer4);
Qt3DRender::QLayerFilter *layerFilter2 = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter2->setFilterMode(Qt3DRender::QLayerFilter::AcceptAnyMatchingLayers);
layerFilter2->addLayer(layer2);
layerFilter2->addLayer(layer3);
Qt3DRender::QLayerFilter *layerFilter3 = new Qt3DRender::QLayerFilter(rootEntity);
layerFilter3->setFilterMode(Qt3DRender::QLayerFilter::AcceptAllMatchingLayers);
layerFilter3->addLayer(layer);
layerFilter3->addLayer(layer6);
QTest::newRow("NestedFiltering-SelectAllNoneOfAnyLayer45AndAnyOf23AndAllOf16-ShouldSelectChild4-Step1") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< rootEntity->id()
<< childEntity1->id()
<< childEntity4->id()
);
QTest::newRow("NestedFiltering-SelectAllNoneOfAnyLayer45AndAnyOf23AndAllOf16-ShouldSelectChild4-Step2") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id() << layerFilter2->id())
<< (Qt3DCore::QNodeIdVector()
<< childEntity1->id()
<< childEntity4->id());
QTest::newRow("NestedFiltering-SelectAllNoneOfAnyLayer45AndAnyOf23AndAllOf16-ShouldSelectChild4-Step3") << rootEntity
<< (Qt3DCore::QNodeIdVector() << layerFilter->id() << layerFilter2->id() << layerFilter3->id())
<< (Qt3DCore::QNodeIdVector()
<< childEntity4->id());
}
}
void filterEntities()
{
//QSKIP("Skipping until TestAspect can be registered");
QFETCH(Qt3DCore::QEntity *, entitySubtree);
QFETCH(Qt3DCore::QNodeIdVector, layerFilterIds);
QFETCH(Qt3DCore::QNodeIdVector, expectedSelectedEntities);
// GIVEN
QScopedPointer<Qt3DRender::TestAspect> aspect(new Qt3DRender::TestAspect(entitySubtree));
// WHEN
Qt3DRender::Render::Entity *backendRoot = aspect->nodeManagers()->renderNodesManager()->getOrCreateResource(entitySubtree->id());
Qt3DRender::Render::UpdateTreeEnabledJob updateTreeEnabledJob;
updateTreeEnabledJob.setRoot(backendRoot);
updateTreeEnabledJob.setManagers(aspect->nodeManagers());
updateTreeEnabledJob.run();
// WHEN
Qt3DRender::Render::UpdateEntityLayersJob updateLayerEntityJob;
updateLayerEntityJob.setManager(aspect->nodeManagers());
updateLayerEntityJob.run();
Qt3DRender::Render::FilterLayerEntityJob filterJob;
filterJob.setLayerFilters(layerFilterIds);
filterJob.setManager(aspect->nodeManagers());
filterJob.run();
// THEN
const QVector<Qt3DRender::Render::Entity *> filterEntities = filterJob.filteredEntities();
QCOMPARE(filterEntities.size(), expectedSelectedEntities.size());
for (auto i = 0, m = expectedSelectedEntities.size(); i < m; ++i)
QCOMPARE(filterEntities.at(i)->peerId(), expectedSelectedEntities.at(i));
}
};
QTEST_MAIN(tst_LayerFiltering)
#include "tst_layerfiltering.moc"