@ -25,10 +25,14 @@
# include <sstream>
# include <sstream>
# include <Corrade/Containers/BitArray.h>
# include <Corrade/Containers/BitArray.h>
# include <Corrade/Containers/Pair.h>
# include <Corrade/Containers/StridedBitArrayView.h>
# include <Corrade/Containers/StridedBitArrayView.h>
# include <Corrade/TestSuite/Tester.h>
# include <Corrade/TestSuite/Tester.h>
# include <Corrade/TestSuite/Compare/Container.h>
# include <Corrade/Utility/DebugStl.h>
# include <Corrade/Utility/DebugStl.h>
# include "Magnum/Math/Complex.h"
# include "Magnum/Math/Vector2.h"
# include "Magnum/SceneTools/Filter.h"
# include "Magnum/SceneTools/Filter.h"
# include "Magnum/Trade/SceneData.h"
# include "Magnum/Trade/SceneData.h"
@ -45,6 +49,26 @@ struct FilterTest: TestSuite::Tester {
void exceptFields ( ) ;
void exceptFields ( ) ;
void exceptFieldsNoFieldData ( ) ;
void exceptFieldsNoFieldData ( ) ;
void fieldEntries ( ) ;
void fieldEntriesFieldNotFound ( ) ;
void fieldEntriesDuplicated ( ) ;
void fieldEntriesWrongBitCount ( ) ;
void fieldEntriesStringField ( ) ;
void fieldEntriesBitField ( ) ;
void fieldEntriesSharedMapping ( ) ;
void fieldEntriesSharedMappingInvalid ( ) ;
} ;
using namespace Math : : Literals ;
const struct {
const char * name ;
bool byName ;
} FieldEntriesData [ ] {
{ " by ID " , false } ,
{ " by name " , true }
} ;
} ;
FilterTest : : FilterTest ( ) {
FilterTest : : FilterTest ( ) {
@ -56,6 +80,18 @@ FilterTest::FilterTest() {
& FilterTest : : exceptFields ,
& FilterTest : : exceptFields ,
& FilterTest : : exceptFieldsNoFieldData } ) ;
& FilterTest : : exceptFieldsNoFieldData } ) ;
addInstancedTests ( { & FilterTest : : fieldEntries } ,
Containers : : arraySize ( FieldEntriesData ) ) ;
addTests ( { & FilterTest : : fieldEntriesFieldNotFound ,
& FilterTest : : fieldEntriesDuplicated ,
& FilterTest : : fieldEntriesWrongBitCount ,
& FilterTest : : fieldEntriesStringField ,
& FilterTest : : fieldEntriesBitField ,
& FilterTest : : fieldEntriesSharedMapping ,
& FilterTest : : fieldEntriesSharedMappingInvalid } ) ;
}
}
void FilterTest : : fields ( ) {
void FilterTest : : fields ( ) {
@ -259,6 +295,471 @@ void FilterTest::exceptFieldsNoFieldData() {
CORRADE_COMPARE ( filtered . dataFlags ( ) , Trade : : DataFlags { } ) ;
CORRADE_COMPARE ( filtered . dataFlags ( ) , Trade : : DataFlags { } ) ;
}
}
void FilterTest : : fieldEntries ( ) {
auto & & data = FieldEntriesData [ testCaseInstanceId ( ) ] ;
setTestCaseDescription ( data . name ) ;
const struct Data {
UnsignedShort meshMapping [ 5 ] { 7 , 8 , 6666 , 3 , 6666 } ;
UnsignedByte mesh [ 5 ] { 2 , 3 , 222 , 1 , 222 } ;
UnsignedShort lightMapping [ 4 ] { 3 , 1 , 2 , 2 } ;
UnsignedInt light [ 4 ] { 12 , 23 , 32 , 31 } ;
UnsignedShort arrayMapping [ 3 ] { 6666 , 3 , 2 } ;
Float array [ 3 ] [ 2 ] { { 77.0f , 88.0f } , { 1.0f , 2.0f } , { 3.0f , 4.0f } } ;
UnsignedShort visibilityMapping [ 2 ] { 12 , 33 } ;
bool visible [ 2 ] { true , false } ;
UnsignedShort parentMapping [ 3 ] { } ;
Short parents [ 3 ] { } ;
} sceneData [ 1 ] { } ;
Trade : : SceneData scene { Trade : : SceneMappingType : : UnsignedShort , 76 , { } , sceneData , {
Trade : : SceneFieldData { Trade : : SceneField : : Mesh ,
Containers : : arrayView ( sceneData - > meshMapping ) ,
Containers : : arrayView ( sceneData - > mesh ) } ,
/* Offset-only, to verify it get converted to absolute when it reaches
combine ( ) at the end */
Trade : : SceneFieldData { Trade : : SceneField : : Light , 4 ,
Trade : : SceneMappingType : : UnsignedShort , offsetof ( Data , lightMapping ) , sizeof ( UnsignedShort ) ,
Trade : : SceneFieldType : : UnsignedInt , offsetof ( Data , light ) , sizeof ( UnsignedInt ) } ,
/* Array */
Trade : : SceneFieldData { Trade : : sceneFieldCustom ( 333 ) ,
Containers : : arrayView ( sceneData - > arrayMapping ) ,
Containers : : arrayCast < 2 , const Float > ( Containers : : stridedArrayView ( sceneData - > array ) ) } ,
/* Bit field. Should cause no assert as it's just passed through. */
Trade : : SceneFieldData { Trade : : sceneFieldCustom ( 15 ) ,
Containers : : arrayView ( sceneData - > visibilityMapping ) ,
Containers : : stridedArrayView ( sceneData - > visible ) . sliceBit ( 0 ) } ,
/* This one gets all entries removed */
Trade : : SceneFieldData { Trade : : SceneField : : Parent ,
Containers : : arrayView ( sceneData - > parentMapping ) ,
Containers : : arrayView ( sceneData - > parents ) } ,
/* This one is already empty */
Trade : : SceneFieldData { Trade : : SceneField : : Camera ,
Containers : : ArrayView < UnsignedShort > { } ,
Containers : : ArrayView < UnsignedByte > { } } ,
} } ;
Containers : : BitArray meshesToKeep { DirectInit , Containers : : arraySize ( sceneData - > mesh ) , true } ;
meshesToKeep . reset ( 2 ) ;
meshesToKeep . reset ( 4 ) ;
Containers : : BitArray arraysToKeep { DirectInit , Containers : : arraySize ( sceneData - > array ) , true } ;
arraysToKeep . reset ( 0 ) ;
Containers : : BitArray parentsToKeep { DirectInit , Containers : : arraySize ( sceneData - > parents ) , false } ;
Containers : : BitArray camerasToKeep ;
Trade : : SceneData filtered = data . byName ?
filterFieldEntries ( scene , {
{ Trade : : sceneFieldCustom ( 333 ) , arraysToKeep } ,
{ Trade : : SceneField : : Parent , parentsToKeep } ,
{ Trade : : SceneField : : Mesh , meshesToKeep } ,
{ Trade : : SceneField : : Camera , camerasToKeep }
} ) :
filterFieldEntries ( scene , {
{ 2 , arraysToKeep } ,
{ 4 , parentsToKeep } ,
{ 0 , meshesToKeep } ,
{ 5 , camerasToKeep }
} ) ;
CORRADE_COMPARE ( filtered . fieldCount ( ) , 6 ) ;
CORRADE_COMPARE ( filtered . mappingType ( ) , Trade : : SceneMappingType : : UnsignedShort ) ;
CORRADE_COMPARE ( filtered . mappingBound ( ) , 76 ) ;
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Mesh ) ) ;
CORRADE_COMPARE_AS ( filtered . mapping < UnsignedShort > ( Trade : : SceneField : : Mesh ) ,
Containers : : arrayView < UnsignedShort > ( { 7 , 8 , 3 } ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_COMPARE_AS ( filtered . field < UnsignedByte > ( Trade : : SceneField : : Mesh ) ,
Containers : : arrayView < UnsignedByte > ( { 2 , 3 , 1 } ) ,
TestSuite : : Compare : : Container ) ;
/* Lights weren't listed and thus stayed untouched */
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Light ) ) ;
CORRADE_COMPARE_AS ( filtered . mapping < UnsignedShort > ( Trade : : SceneField : : Light ) ,
Containers : : arrayView ( sceneData - > lightMapping ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_COMPARE_AS ( filtered . field < UnsignedInt > ( Trade : : SceneField : : Light ) ,
Containers : : arrayView ( sceneData - > light ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_VERIFY ( filtered . hasField ( Trade : : sceneFieldCustom ( 333 ) ) ) ;
CORRADE_COMPARE_AS ( filtered . mapping < UnsignedShort > ( Trade : : sceneFieldCustom ( 333 ) ) ,
Containers : : arrayView < UnsignedShort > ( { 3 , 2 } ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_COMPARE_AS ( ( Containers : : arrayCast < 1 , const Vector2 > ( filtered . field < Float [ ] > ( Trade : : sceneFieldCustom ( 333 ) ) ) ) ,
Containers : : arrayView < Vector2 > ( { { 1.0f , 2.0f } , { 3.0f , 4.0f } } ) ,
TestSuite : : Compare : : Container ) ;
/* Bits weren't listed and thus stayed untouched */
CORRADE_VERIFY ( filtered . hasField ( Trade : : sceneFieldCustom ( 15 ) ) ) ;
CORRADE_COMPARE_AS ( filtered . mapping < UnsignedShort > ( Trade : : sceneFieldCustom ( 15 ) ) ,
Containers : : arrayView ( sceneData - > visibilityMapping ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_COMPARE_AS ( filtered . fieldBits ( Trade : : sceneFieldCustom ( 15 ) ) ,
Containers : : stridedArrayView ( sceneData - > visible ) . sliceBit ( 0 ) ,
TestSuite : : Compare : : Container ) ;
/* Parents are all removed */
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Parent ) ) ;
CORRADE_COMPARE ( filtered . fieldSize ( Trade : : SceneField : : Parent ) , 0 ) ;
/* Cameras were empty before already */
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Camera ) ) ;
CORRADE_COMPARE ( filtered . fieldSize ( Trade : : SceneField : : Camera ) , 0 ) ;
/* The attribute data should not be a growable array to make this usable in
plugins */
Containers : : Array < Trade : : SceneFieldData > fieldData = filtered . releaseFieldData ( ) ;
CORRADE_VERIFY ( ! fieldData . deleter ( ) ) ;
}
void FilterTest : : fieldEntriesFieldNotFound ( ) {
CORRADE_SKIP_IF_NO_ASSERT ( ) ;
const struct {
UnsignedShort meshMapping [ 5 ] ;
UnsignedByte mesh [ 5 ] ;
UnsignedShort lightMapping [ 4 ] ;
UnsignedInt light [ 4 ] ;
} data [ 1 ] { } ;
Trade : : SceneData scene { Trade : : SceneMappingType : : UnsignedShort , 76 , { } , data , {
Trade : : SceneFieldData { Trade : : SceneField : : Mesh ,
Containers : : arrayView ( data - > meshMapping ) ,
Containers : : arrayView ( data - > mesh ) } ,
Trade : : SceneFieldData { Trade : : SceneField : : Light ,
Containers : : arrayView ( data - > lightMapping ) ,
Containers : : arrayView ( data - > light ) } ,
} } ;
std : : ostringstream out ;
Error redirectError { & out } ;
filterFieldEntries ( scene , {
{ Trade : : SceneField : : Light , Containers : : BitArray { ValueInit , 4 } } ,
{ Trade : : SceneField : : Parent , { } }
} ) ;
filterFieldEntries ( scene , {
{ 1 , Containers : : BitArray { ValueInit , 4 } } ,
{ 2 , { } }
} ) ;
CORRADE_COMPARE ( out . str ( ) ,
" SceneTools::filterFieldEntries(): field Trade::SceneField::Parent not found \n "
" SceneTools::filterFieldEntries(): index 2 out of range for 2 fields \n " ) ;
}
void FilterTest : : fieldEntriesDuplicated ( ) {
CORRADE_SKIP_IF_NO_ASSERT ( ) ;
const struct {
UnsignedShort meshMapping [ 5 ] ;
UnsignedByte mesh [ 5 ] ;
UnsignedShort lightMapping [ 4 ] ;
UnsignedInt light [ 4 ] ;
} data [ 1 ] { } ;
Trade : : SceneData scene { Trade : : SceneMappingType : : UnsignedShort , 76 , { } , data , {
Trade : : SceneFieldData { Trade : : SceneField : : Mesh ,
Containers : : arrayView ( data - > meshMapping ) ,
Containers : : arrayView ( data - > mesh ) } ,
Trade : : SceneFieldData { Trade : : SceneField : : Light ,
Containers : : arrayView ( data - > lightMapping ) ,
Containers : : arrayView ( data - > light ) } ,
} } ;
std : : ostringstream out ;
Error redirectError { & out } ;
/* The name-based variant just delegates to this one, no need to test it
as well */
filterFieldEntries ( scene , {
{ 1 , Containers : : BitArray { ValueInit , 4 } } ,
{ 0 , Containers : : BitArray { ValueInit , 5 } } ,
{ 1 , Containers : : BitArray { ValueInit , 4 } } ,
} ) ;
CORRADE_COMPARE ( out . str ( ) , " SceneTools::filterFieldEntries(): field Trade::SceneField::Light listed more than once \n " ) ;
}
void FilterTest : : fieldEntriesWrongBitCount ( ) {
CORRADE_SKIP_IF_NO_ASSERT ( ) ;
const struct {
UnsignedShort meshMapping [ 5 ] ;
UnsignedByte mesh [ 5 ] ;
UnsignedShort lightMapping [ 4 ] ;
UnsignedInt light [ 4 ] ;
} data [ 1 ] { } ;
Trade : : SceneData scene { Trade : : SceneMappingType : : UnsignedShort , 76 , { } , data , {
Trade : : SceneFieldData { Trade : : SceneField : : Mesh ,
Containers : : arrayView ( data - > meshMapping ) ,
Containers : : arrayView ( data - > mesh ) } ,
Trade : : SceneFieldData { Trade : : SceneField : : Light ,
Containers : : arrayView ( data - > lightMapping ) ,
Containers : : arrayView ( data - > light ) } ,
} } ;
std : : ostringstream out ;
Error redirectError { & out } ;
/* The name-based variant just delegates to this one, no need to test it
as well */
filterFieldEntries ( scene , {
{ 1 , Containers : : BitArray { ValueInit , 4 } } ,
{ 0 , Containers : : BitArray { ValueInit , 6 } }
} ) ;
CORRADE_COMPARE ( out . str ( ) , " SceneTools::filterFieldEntries(): expected 5 bits for Trade::SceneField::Mesh but got 6 \n " ) ;
}
void FilterTest : : fieldEntriesBitField ( ) {
CORRADE_SKIP_IF_NO_ASSERT ( ) ;
const struct {
UnsignedShort meshMapping [ 5 ] ;
UnsignedByte mesh [ 5 ] ;
UnsignedShort visibilityMapping [ 2 ] ;
bool visible [ 2 ] ;
} data [ 1 ] { } ;
Trade : : SceneData scene { Trade : : SceneMappingType : : UnsignedShort , 76 , { } , data , {
Trade : : SceneFieldData { Trade : : SceneField : : Mesh ,
Containers : : arrayView ( data - > meshMapping ) ,
Containers : : arrayView ( data - > mesh ) } ,
Trade : : SceneFieldData { Trade : : sceneFieldCustom ( 15 ) ,
Containers : : arrayView ( data - > visibilityMapping ) ,
Containers : : stridedArrayView ( data - > visible ) . sliceBit ( 0 ) } ,
} } ;
std : : ostringstream out ;
Error redirectError { & out } ;
/* The name-based variant just delegates to this one, no need to test it
as well */
filterFieldEntries ( scene , {
{ 0 , Containers : : BitArray { ValueInit , 5 } } ,
{ 1 , Containers : : BitArray { ValueInit , 2 } }
} ) ;
CORRADE_COMPARE ( out . str ( ) , " SceneTools::filterFieldEntries(): filtering bit fields is not implemented yet, sorry \n " ) ;
}
void FilterTest : : fieldEntriesStringField ( ) {
CORRADE_SKIP_IF_NO_ASSERT ( ) ;
const struct {
UnsignedShort meshMapping [ 5 ] ;
UnsignedByte mesh [ 5 ] ;
UnsignedShort nameMapping [ 2 ] ;
UnsignedInt nameRangeNullTerminated [ 2 ] ;
char nameString [ 1 ] ;
} data [ 1 ] { } ;
Trade : : SceneData scene { Trade : : SceneMappingType : : UnsignedShort , 76 , { } , data , {
Trade : : SceneFieldData { Trade : : SceneField : : Mesh ,
Containers : : arrayView ( data - > meshMapping ) ,
Containers : : arrayView ( data - > mesh ) } ,
Trade : : SceneFieldData { Trade : : sceneFieldCustom ( 15 ) ,
Containers : : arrayView ( data - > nameMapping ) ,
data - > nameString , Trade : : SceneFieldType : : StringRangeNullTerminated32 ,
Containers : : arrayView ( data - > nameRangeNullTerminated ) } ,
} } ;
std : : ostringstream out ;
Error redirectError { & out } ;
/* The name-based variant just delegates to this one, no need to test it
as well */
filterFieldEntries ( scene , {
{ 0 , Containers : : BitArray { ValueInit , 5 } } ,
{ 1 , Containers : : BitArray { ValueInit , 2 } }
} ) ;
CORRADE_COMPARE ( out . str ( ) , " SceneTools::filterFieldEntries(): filtering string fields is not implemented yet, sorry \n " ) ;
}
void FilterTest : : fieldEntriesSharedMapping ( ) {
const struct {
UnsignedShort meshMaterialMapping [ 5 ] { 7 , 8 , 6666 , 6666 , 3 } ;
UnsignedByte mesh [ 5 ] { 2 , 3 , 222 , 222 , 1 } ;
Byte meshMaterial [ 5 ] { - 1 , 7 , 111 , 111 , 0 } ;
UnsignedShort trsMapping [ 5 ] { 1 , 6666 , 7 , 6666 , 3 } ;
Vector2 translation [ 5 ] {
{ 1.0f , 2.0f } ,
{ } ,
{ 3.0f , 4.0f } ,
{ } ,
{ 5.0f , 6.0f }
} ;
Complex rotation [ 5 ] {
Complex : : rotation ( 15.0 _degf ) ,
{ } ,
Complex : : rotation ( 30.0 _degf ) ,
{ } ,
Complex : : rotation ( 45.0 _degf )
} ;
Float uniformScale [ 5 ] { 10.0f , 0.0f , - 5.0f , 0.0f , 555.0f } ;
UnsignedInt light [ 2 ] { 34 , 25 } ;
Int parent [ 3 ] { - 1 , 0 , 3 } ;
} data [ 1 ] { } ;
Trade : : SceneData scene { Trade : : SceneMappingType : : UnsignedShort , 176 , { } , data , {
Trade : : SceneFieldData { Trade : : SceneField : : Mesh ,
Containers : : arrayView ( data - > meshMaterialMapping ) ,
Containers : : arrayView ( data - > mesh ) } ,
Trade : : SceneFieldData { Trade : : SceneField : : MeshMaterial ,
Containers : : arrayView ( data - > meshMaterialMapping ) ,
Containers : : arrayView ( data - > meshMaterial ) } ,
Trade : : SceneFieldData { Trade : : SceneField : : Translation ,
Containers : : arrayView ( data - > trsMapping ) ,
Containers : : arrayView ( data - > translation ) } ,
Trade : : SceneFieldData { Trade : : SceneField : : Rotation ,
Containers : : arrayView ( data - > trsMapping ) ,
Containers : : arrayView ( data - > rotation ) } ,
/* Shares trsMapping, sharing should be preserved even though not
enforced */
Trade : : SceneFieldData { Trade : : sceneFieldCustom ( 15 ) ,
Containers : : arrayView ( data - > trsMapping ) ,
Containers : : arrayView ( data - > uniformScale ) } ,
/* Shares a prefix of meshMaterialMapping, should not be preserved */
Trade : : SceneFieldData { Trade : : SceneField : : Light ,
Containers : : arrayView ( data - > meshMaterialMapping ) . prefix ( 2 ) ,
Containers : : arrayView ( data - > light ) } ,
/* Shares every 2nd item of trsMapping, should not be preserved */
Trade : : SceneFieldData { Trade : : SceneField : : Parent ,
Containers : : stridedArrayView ( data - > trsMapping ) . every ( 2 ) ,
Containers : : arrayView ( data - > parent ) } ,
} } ;
Containers : : BitArray meshesToKeep { DirectInit , Containers : : arraySize ( data - > mesh ) , true } ;
meshesToKeep . reset ( 2 ) ;
meshesToKeep . reset ( 3 ) ;
Containers : : BitArray transformationsToKeep { DirectInit , Containers : : arraySize ( data - > trsMapping ) , true } ;
transformationsToKeep . reset ( 1 ) ;
transformationsToKeep . reset ( 3 ) ;
Trade : : SceneData filtered = filterFieldEntries ( scene , {
/* All shared fields have to be listed with the same view */
{ Trade : : SceneField : : Mesh , meshesToKeep } ,
{ Trade : : SceneField : : MeshMaterial , meshesToKeep } ,
{ Trade : : SceneField : : Translation , transformationsToKeep } ,
{ Trade : : SceneField : : Rotation , transformationsToKeep } ,
{ Trade : : sceneFieldCustom ( 15 ) , transformationsToKeep } ,
} ) ;
CORRADE_COMPARE ( filtered . fieldCount ( ) , 7 ) ;
CORRADE_COMPARE ( filtered . mappingType ( ) , Trade : : SceneMappingType : : UnsignedShort ) ;
CORRADE_COMPARE ( filtered . mappingBound ( ) , 176 ) ;
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Mesh ) ) ;
CORRADE_COMPARE_AS ( filtered . mapping < UnsignedShort > ( Trade : : SceneField : : Mesh ) ,
Containers : : arrayView < UnsignedShort > ( { 7 , 8 , 3 } ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_COMPARE_AS ( filtered . field < UnsignedByte > ( Trade : : SceneField : : Mesh ) ,
Containers : : arrayView < UnsignedByte > ( { 2 , 3 , 1 } ) ,
TestSuite : : Compare : : Container ) ;
/* Mapping shared with Mesh */
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : MeshMaterial ) ) ;
CORRADE_COMPARE ( filtered . mapping ( Trade : : SceneField : : MeshMaterial ) . data ( ) ,
filtered . mapping ( Trade : : SceneField : : Mesh ) . data ( ) ) ;
CORRADE_COMPARE_AS ( filtered . field < Byte > ( Trade : : SceneField : : MeshMaterial ) ,
Containers : : arrayView < Byte > ( { - 1 , 7 , 0 } ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Translation ) ) ;
CORRADE_COMPARE_AS ( filtered . mapping < UnsignedShort > ( Trade : : SceneField : : Translation ) ,
Containers : : arrayView < UnsignedShort > ( { 1 , 7 , 3 } ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_COMPARE_AS ( filtered . field < Vector2 > ( Trade : : SceneField : : Translation ) ,
Containers : : arrayView < Vector2 > ( { { 1.0f , 2.0f } , { 3.0f , 4.0f } , { 5.0f , 6.0f } } ) ,
TestSuite : : Compare : : Container ) ;
/* Mapping shared with Translation */
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Rotation ) ) ;
CORRADE_COMPARE ( filtered . mapping ( Trade : : SceneField : : Rotation ) . data ( ) ,
filtered . mapping ( Trade : : SceneField : : Translation ) . data ( ) ) ;
CORRADE_COMPARE_AS ( filtered . field < Complex > ( Trade : : SceneField : : Rotation ) ,
Containers : : arrayView < Complex > ( { Complex : : rotation ( 15.0 _degf ) , Complex : : rotation ( 30.0 _degf ) , Complex : : rotation ( 45.0 _degf ) } ) ,
TestSuite : : Compare : : Container ) ;
/* Mapping shared with Translation again */
CORRADE_VERIFY ( filtered . hasField ( Trade : : sceneFieldCustom ( 15 ) ) ) ;
CORRADE_COMPARE ( filtered . mapping ( Trade : : sceneFieldCustom ( 15 ) ) . data ( ) ,
filtered . mapping ( Trade : : SceneField : : Translation ) . data ( ) ) ;
CORRADE_COMPARE_AS ( filtered . field < Float > ( Trade : : sceneFieldCustom ( 15 ) ) ,
Containers : : arrayView ( { 10.0f , - 5.0f , 555.0f } ) ,
TestSuite : : Compare : : Container ) ;
/* These fields are kept unfiltered and they don't share any mapping even
though they could */
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Light ) ) ;
CORRADE_COMPARE_AS ( filtered . mapping < UnsignedShort > ( Trade : : SceneField : : Light ) ,
Containers : : arrayView < UnsignedShort > ( { 7 , 8 } ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_VERIFY ( filtered . mapping ( Trade : : SceneField : : Light ) . data ( ) ! = filtered . mapping ( Trade : : SceneField : : Mesh ) . data ( ) ) ;
CORRADE_COMPARE_AS ( filtered . field < UnsignedInt > ( Trade : : SceneField : : Light ) ,
Containers : : arrayView ( data - > light ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_VERIFY ( filtered . hasField ( Trade : : SceneField : : Parent ) ) ;
CORRADE_COMPARE_AS ( filtered . mapping < UnsignedShort > ( Trade : : SceneField : : Parent ) ,
Containers : : arrayView < UnsignedShort > ( { 1 , 7 , 3 } ) ,
TestSuite : : Compare : : Container ) ;
CORRADE_VERIFY ( filtered . mapping ( Trade : : SceneField : : Parent ) . data ( ) ! = filtered . mapping ( Trade : : SceneField : : Translation ) . data ( ) ) ;
CORRADE_COMPARE_AS ( filtered . field < Int > ( Trade : : SceneField : : Parent ) ,
Containers : : arrayView ( data - > parent ) ,
TestSuite : : Compare : : Container ) ;
}
void FilterTest : : fieldEntriesSharedMappingInvalid ( ) {
CORRADE_SKIP_IF_NO_ASSERT ( ) ;
const struct {
UnsignedShort lightMapping [ 4 ] ;
UnsignedInt light [ 4 ] ;
UnsignedShort meshMaterialMapping [ 5 ] ;
UnsignedByte mesh [ 5 ] ;
Byte meshMaterial [ 5 ] ;
UnsignedLong meshIndexOffset [ 5 ] ;
} data [ 1 ] { } ;
Trade : : SceneData scene { Trade : : SceneMappingType : : UnsignedShort , 176 , { } , data , {
Trade : : SceneFieldData { Trade : : SceneField : : Light ,
Containers : : arrayView ( data - > lightMapping ) ,
Containers : : arrayView ( data - > light ) } ,
Trade : : SceneFieldData { Trade : : SceneField : : Mesh ,
Containers : : arrayView ( data - > meshMaterialMapping ) ,
Containers : : arrayView ( data - > mesh ) } ,
Trade : : SceneFieldData { Trade : : sceneFieldCustom ( 1 ) ,
Containers : : arrayView ( data - > meshMaterialMapping ) ,
Containers : : arrayView ( data - > meshIndexOffset ) } ,
Trade : : SceneFieldData { Trade : : SceneField : : MeshMaterial ,
Containers : : arrayView ( data - > meshMaterialMapping ) ,
Containers : : arrayView ( data - > meshMaterial ) } ,
} } ;
Containers : : BitArray meshesToKeep { ValueInit , 5 } ;
Containers : : BitArray meshesToKeepDifferent { DirectInit , 5 , true } ;
std : : ostringstream out ;
Error redirectError { & out } ;
filterFieldEntries ( scene , {
{ Trade : : SceneField : : MeshMaterial , meshesToKeep } ,
{ Trade : : SceneField : : Mesh , meshesToKeep } ,
{ Trade : : sceneFieldCustom ( 1 ) , meshesToKeepDifferent } ,
} ) ;
filterFieldEntries ( scene , {
{ Trade : : SceneField : : Mesh , meshesToKeep } ,
{ Trade : : SceneField : : MeshMaterial , meshesToKeep } ,
} ) ;
filterFieldEntries ( scene , {
{ Trade : : sceneFieldCustom ( 1 ) , meshesToKeep } ,
{ Trade : : SceneField : : MeshMaterial , meshesToKeep } ,
} ) ;
CORRADE_COMPARE ( out . str ( ) ,
" SceneTools::filterFieldEntries(): field Trade::SceneField::Custom(1) shares mapping with Trade::SceneField::MeshMaterial but was passed a different mask view \n "
" SceneTools::filterFieldEntries(): field Trade::SceneField::Mesh shares mapping with 3 fields but only 2 are filtered \n "
" SceneTools::filterFieldEntries(): field Trade::SceneField::Custom(1) shares mapping with 3 fields but only 2 are filtered \n " ) ;
}
} } } }
} } } }
CORRADE_TEST_MAIN ( Magnum : : SceneTools : : Test : : FilterTest )
CORRADE_TEST_MAIN ( Magnum : : SceneTools : : Test : : FilterTest )