@ -26,8 +26,7 @@
# include "Combine.h"
# include "Combine.h"
# include <numeric>
# include <numeric>
# include <Corrade/Containers/ArrayView.h>
# include <Corrade/Containers/Iterable.h>
# include <Corrade/Containers/Reference.h>
# include <Corrade/Utility/Algorithms.h>
# include <Corrade/Utility/Algorithms.h>
# include "Magnum/Math/Functions.h"
# include "Magnum/Math/Functions.h"
@ -44,20 +43,20 @@ Trade::MeshData combineIndexedImplementation(
# ifndef CORRADE_NO_ASSERT
# ifndef CORRADE_NO_ASSERT
const char * assertPrefix ,
const char * assertPrefix ,
# endif
# endif
const MeshPrimitive primitive , Containers : : Array < char > & combinedIndices , const UnsignedInt indexCount , const UnsignedInt indexStride , const Containers : : ArrayView < const Containers : : Referenc e< const Trade : : MeshData > > data )
const MeshPrimitive primitive , Containers : : Array < char > & combinedIndices , const UnsignedInt indexCount , const UnsignedInt indexStride , const Containers : : Iterabl e< const Trade : : MeshData > data )
{
{
/* Calculate attribute count and vertex stride */
/* Calculate attribute count and vertex stride */
UnsignedInt attributeCount = 0 ;
UnsignedInt attributeCount = 0 ;
UnsignedInt vertexStride = 0 ;
UnsignedInt vertexStride = 0 ;
for ( std : : size_t i = 0 ; i ! = data . size ( ) ; + + i ) {
for ( std : : size_t i = 0 ; i ! = data . size ( ) ; + + i ) {
attributeCount + = data [ i ] - > attributeCount ( ) ;
attributeCount + = data [ i ] . attributeCount ( ) ;
for ( UnsignedInt j = 0 ; j ! = data [ i ] - > attributeCount ( ) ; + + j ) {
for ( UnsignedInt j = 0 ; j ! = data [ i ] . attributeCount ( ) ; + + j ) {
const VertexFormat format = data [ i ] - > attributeFormat ( j ) ;
const VertexFormat format = data [ i ] . attributeFormat ( j ) ;
CORRADE_ASSERT ( ! isVertexFormatImplementationSpecific ( format ) ,
CORRADE_ASSERT ( ! isVertexFormatImplementationSpecific ( format ) ,
assertPrefix < < " attribute " < < j < < " of mesh " < < i < < " has an implementation-specific format " < < reinterpret_cast < void * > ( vertexFormatUnwrap ( format ) ) ,
assertPrefix < < " attribute " < < j < < " of mesh " < < i < < " has an implementation-specific format " < < reinterpret_cast < void * > ( vertexFormatUnwrap ( format ) ) ,
( Trade : : MeshData { MeshPrimitive : : Points , 0 } ) ) ;
( Trade : : MeshData { MeshPrimitive : : Points , 0 } ) ) ;
vertexStride + = vertexFormatSize ( format ) * Math : : max ( data [ i ] - > attributeArraySize ( j ) , UnsignedShort { 1 } ) ;
vertexStride + = vertexFormatSize ( format ) * Math : : max ( data [ i ] . attributeArraySize ( j ) , UnsignedShort { 1 } ) ;
}
}
}
}
@ -111,7 +110,7 @@ Trade::MeshData combineIndexedImplementation(
}
}
Trade : : MeshData combineIndexedAttributes ( const Containers : : ArrayView < const Containers : : Referenc e< const Trade : : MeshData > > data ) {
Trade : : MeshData combineIndexedAttributes ( const Containers : : Iterabl e< const Trade : : MeshData > data ) {
CORRADE_ASSERT ( ! data . isEmpty ( ) ,
CORRADE_ASSERT ( ! data . isEmpty ( ) ,
" MeshTools::combineIndexedAttributes(): no meshes passed " ,
" MeshTools::combineIndexedAttributes(): no meshes passed " ,
( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
@ -124,21 +123,21 @@ Trade::MeshData combineIndexedAttributes(const Containers::ArrayView<const Conta
UnsignedInt indexCount { } ;
UnsignedInt indexCount { } ;
UnsignedInt indexStride = 0 ;
UnsignedInt indexStride = 0 ;
for ( std : : size_t i = 0 ; i ! = data . size ( ) ; + + i ) {
for ( std : : size_t i = 0 ; i ! = data . size ( ) ; + + i ) {
CORRADE_ASSERT ( data [ i ] - > isIndexed ( ) ,
CORRADE_ASSERT ( data [ i ] . isIndexed ( ) ,
" MeshTools::combineIndexedAttributes(): data " < < i < < " is not indexed " ,
" MeshTools::combineIndexedAttributes(): data " < < i < < " is not indexed " ,
( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
const MeshIndexType indexType = data [ i ] - > indexType ( ) ;
const MeshIndexType indexType = data [ i ] . indexType ( ) ;
CORRADE_ASSERT ( ! isMeshIndexTypeImplementationSpecific ( indexType ) ,
CORRADE_ASSERT ( ! isMeshIndexTypeImplementationSpecific ( indexType ) ,
" MeshTools::combineIndexedAttributes(): data " < < i < < " has an implementation-specific index type " < < reinterpret_cast < void * > ( meshIndexTypeUnwrap ( indexType ) ) ,
" MeshTools::combineIndexedAttributes(): data " < < i < < " has an implementation-specific index type " < < reinterpret_cast < void * > ( meshIndexTypeUnwrap ( indexType ) ) ,
( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
if ( i = = 0 ) {
if ( i = = 0 ) {
primitive = data [ i ] - > primitive ( ) ;
primitive = data [ i ] . primitive ( ) ;
indexCount = data [ i ] - > indexCount ( ) ;
indexCount = data [ i ] . indexCount ( ) ;
} else {
} else {
CORRADE_ASSERT ( data [ i ] - > primitive ( ) = = primitive ,
CORRADE_ASSERT ( data [ i ] . primitive ( ) = = primitive ,
" MeshTools::combineIndexedAttributes(): data " < < i < < " is " < < data [ i ] - > primitive ( ) < < " but expected " < < primitive , ( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
" MeshTools::combineIndexedAttributes(): data " < < i < < " is " < < data [ i ] . primitive ( ) < < " but expected " < < primitive , ( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
CORRADE_ASSERT ( data [ i ] - > indexCount ( ) = = indexCount ,
CORRADE_ASSERT ( data [ i ] . indexCount ( ) = = indexCount ,
" MeshTools::combineIndexedAttributes(): data " < < i < < " has " < < data [ i ] - > indexCount ( ) < < " indices but expected " < < indexCount , ( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
" MeshTools::combineIndexedAttributes(): data " < < i < < " has " < < data [ i ] . indexCount ( ) < < " indices but expected " < < indexCount , ( Trade : : MeshData { MeshPrimitive { } , 0 } ) ) ;
}
}
indexStride + = meshIndexTypeSize ( indexType ) ;
indexStride + = meshIndexTypeSize ( indexType ) ;
}
}
@ -171,10 +170,6 @@ Trade::MeshData combineIndexedAttributes(const Containers::ArrayView<const Conta
primitive , combinedIndices , indexCount , indexStride , data ) ;
primitive , combinedIndices , indexCount , indexStride , data ) ;
}
}
Trade : : MeshData combineIndexedAttributes ( std : : initializer_list < Containers : : Reference < const Trade : : MeshData > > data ) {
return combineIndexedAttributes ( Containers : : arrayView ( data ) ) ;
}
Trade : : MeshData combineFaceAttributes ( const Trade : : MeshData & mesh , const Trade : : MeshData & faceAttributes ) {
Trade : : MeshData combineFaceAttributes ( const Trade : : MeshData & mesh , const Trade : : MeshData & faceAttributes ) {
CORRADE_ASSERT ( mesh . isIndexed ( ) ,
CORRADE_ASSERT ( mesh . isIndexed ( ) ,
" MeshTools::combineFaceAttributes(): vertex mesh is not indexed " ,
" MeshTools::combineFaceAttributes(): vertex mesh is not indexed " ,
@ -236,10 +231,9 @@ Trade::MeshData combineFaceAttributes(const Trade::MeshData& mesh, const Trade::
# ifndef CORRADE_NO_ASSERT
# ifndef CORRADE_NO_ASSERT
" MeshTools::combineFaceAttributes(): " ,
" MeshTools::combineFaceAttributes(): " ,
# endif
# endif
mesh . primitive ( ) , combinedIndices , meshIndexCount , indexStride ,
mesh . primitive ( ) , combinedIndices , meshIndexCount , indexStride , {
Containers : : arrayView < const Containers : : Reference < const Trade : : MeshData > > ( {
mesh , faceAttributes
mesh , faceAttributes
} ) ) ;
} ) ;
}
}
Trade : : MeshData combineFaceAttributes ( const Trade : : MeshData & mesh , Containers : : ArrayView < const Trade : : MeshAttributeData > faceAttributes ) {
Trade : : MeshData combineFaceAttributes ( const Trade : : MeshData & mesh , Containers : : ArrayView < const Trade : : MeshAttributeData > faceAttributes ) {