summaryrefslogtreecommitdiff
path: root/src/3rdparty/assimp/code/BlenderBMesh.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/assimp/code/BlenderBMesh.cpp')
-rw-r--r--src/3rdparty/assimp/code/BlenderBMesh.cpp164
1 files changed, 95 insertions, 69 deletions
diff --git a/src/3rdparty/assimp/code/BlenderBMesh.cpp b/src/3rdparty/assimp/code/BlenderBMesh.cpp
index 0e517f4c8..bf27a9396 100644
--- a/src/3rdparty/assimp/code/BlenderBMesh.cpp
+++ b/src/3rdparty/assimp/code/BlenderBMesh.cpp
@@ -5,8 +5,8 @@ Open Asset Import Library (assimp)
Copyright (c) 2006-2013, assimp team
All rights reserved.
-Redistribution and use of this software in source and binary forms,
-with or without modification, are permitted provided that the
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
following conditions are met:
* Redistributions of source code must retain the above
@@ -23,16 +23,16 @@ following conditions are met:
derived from this software without specific prior
written permission of the assimp team.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------
@@ -42,7 +42,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* @brief Conversion of Blender's new BMesh stuff
*/
-#include "AssimpPCH.h"
#ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER
@@ -53,7 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Assimp
{
- template< > const std::string LogFunctions< BlenderBMeshConverter >::log_prefix = "BLEND_BMESH: ";
+ template< > const std::string LogFunctions< BlenderBMeshConverter >::log_prefix = "BLEND_BMESH: ";
}
using namespace Assimp;
@@ -62,115 +61,142 @@ using namespace Assimp::Formatter;
// ------------------------------------------------------------------------------------------------
BlenderBMeshConverter::BlenderBMeshConverter( const Mesh* mesh ):
- BMesh( mesh ),
- triMesh( NULL )
+ BMesh( mesh ),
+ triMesh( NULL )
{
- AssertValidMesh( );
}
// ------------------------------------------------------------------------------------------------
BlenderBMeshConverter::~BlenderBMeshConverter( )
{
- DestroyTriMesh( );
+ DestroyTriMesh( );
}
// ------------------------------------------------------------------------------------------------
bool BlenderBMeshConverter::ContainsBMesh( ) const
{
- // TODO - Should probably do some additional verification here
- return BMesh->totpoly && BMesh->totloop && BMesh->totvert;
+ // TODO - Should probably do some additional verification here
+ return BMesh->totpoly && BMesh->totloop && BMesh->totvert;
}
// ------------------------------------------------------------------------------------------------
const Mesh* BlenderBMeshConverter::TriangulateBMesh( )
{
- AssertValidMesh( );
- AssertValidSizes( );
- PrepareTriMesh( );
+ AssertValidMesh( );
+ AssertValidSizes( );
+ PrepareTriMesh( );
- for ( int i = 0; i < BMesh->totpoly; ++i )
- {
- const MPoly& poly = BMesh->mpoly[ i ];
- ConvertPolyToFaces( poly );
- }
+ for ( int i = 0; i < BMesh->totpoly; ++i )
+ {
+ const MPoly& poly = BMesh->mpoly[ i ];
+ ConvertPolyToFaces( poly );
+ }
- return triMesh;
+ return triMesh;
}
// ------------------------------------------------------------------------------------------------
void BlenderBMeshConverter::AssertValidMesh( )
{
- if ( !ContainsBMesh( ) )
- {
- ThrowException( "BlenderBMeshConverter requires a BMesh with \"polygons\" - please call BlenderBMeshConverter::ContainsBMesh to check this first" );
- }
+ if ( !ContainsBMesh( ) )
+ {
+ ThrowException( "BlenderBMeshConverter requires a BMesh with \"polygons\" - please call BlenderBMeshConverter::ContainsBMesh to check this first" );
+ }
}
// ------------------------------------------------------------------------------------------------
void BlenderBMeshConverter::AssertValidSizes( )
{
- if ( BMesh->totpoly != static_cast<int>( BMesh->mpoly.size( ) ) )
- {
- ThrowException( "BMesh poly array has incorrect size" );
- }
- if ( BMesh->totloop != static_cast<int>( BMesh->mloop.size( ) ) )
- {
- ThrowException( "BMesh loop array has incorrect size" );
- }
+ if ( BMesh->totpoly != static_cast<int>( BMesh->mpoly.size( ) ) )
+ {
+ ThrowException( "BMesh poly array has incorrect size" );
+ }
+ if ( BMesh->totloop != static_cast<int>( BMesh->mloop.size( ) ) )
+ {
+ ThrowException( "BMesh loop array has incorrect size" );
+ }
}
// ------------------------------------------------------------------------------------------------
void BlenderBMeshConverter::PrepareTriMesh( )
{
- if ( triMesh )
- {
- DestroyTriMesh( );
- }
-
- triMesh = new Mesh( *BMesh );
- triMesh->totface = 0;
- triMesh->mface.clear( );
+ if ( triMesh )
+ {
+ DestroyTriMesh( );
+ }
+
+ triMesh = new Mesh( *BMesh );
+ triMesh->totface = 0;
+ triMesh->mface.clear( );
}
// ------------------------------------------------------------------------------------------------
void BlenderBMeshConverter::DestroyTriMesh( )
{
- delete triMesh;
- triMesh = NULL;
+ delete triMesh;
+ triMesh = NULL;
}
// ------------------------------------------------------------------------------------------------
void BlenderBMeshConverter::ConvertPolyToFaces( const MPoly& poly )
{
- const MLoop* polyLoop = &BMesh->mloop[ poly.loopstart ];
- if ( poly.totloop == 3 || poly.totloop == 4 )
- {
- AddFace( polyLoop[ 0 ].v, polyLoop[ 1 ].v, polyLoop[ 2 ].v, poly.totloop == 4 ? polyLoop[ 3 ].v : 0 );
- }
- else if ( poly.totloop > 4 )
- {
+ const MLoop* polyLoop = &BMesh->mloop[ poly.loopstart ];
+
+ if ( poly.totloop == 3 || poly.totloop == 4 )
+ {
+ AddFace( polyLoop[ 0 ].v, polyLoop[ 1 ].v, polyLoop[ 2 ].v, poly.totloop == 4 ? polyLoop[ 3 ].v : 0 );
+
+ // UVs are optional, so only convert when present.
+ if ( BMesh->mloopuv.size() )
+ {
+ if ( (poly.loopstart + poly.totloop ) > static_cast<int>( BMesh->mloopuv.size() ) )
+ {
+ ThrowException( "BMesh uv loop array has incorrect size" );
+ }
+ const MLoopUV* loopUV = &BMesh->mloopuv[ poly.loopstart ];
+ AddTFace( loopUV[ 0 ].uv, loopUV[ 1 ].uv, loopUV[ 2 ].uv, poly.totloop == 4 ? loopUV[ 3 ].uv : 0 );
+ }
+ }
+ else if ( poly.totloop > 4 )
+ {
#if ASSIMP_BLEND_WITH_GLU_TESSELLATE
- BlenderTessellatorGL tessGL( *this );
- tessGL.Tessellate( polyLoop, poly.totloop, triMesh->mvert );
+ BlenderTessellatorGL tessGL( *this );
+ tessGL.Tessellate( polyLoop, poly.totloop, triMesh->mvert );
#elif ASSIMP_BLEND_WITH_POLY_2_TRI
- BlenderTessellatorP2T tessP2T( *this );
- tessP2T.Tessellate( polyLoop, poly.totloop, triMesh->mvert );
+ BlenderTessellatorP2T tessP2T( *this );
+ tessP2T.Tessellate( polyLoop, poly.totloop, triMesh->mvert );
#endif
- }
+ }
}
// ------------------------------------------------------------------------------------------------
void BlenderBMeshConverter::AddFace( int v1, int v2, int v3, int v4 )
{
- MFace face;
- face.v1 = v1;
- face.v2 = v2;
- face.v3 = v3;
- face.v4 = v4;
- // TODO - Work out how materials work
- face.mat_nr = 0;
- triMesh->mface.push_back( face );
- triMesh->totface = triMesh->mface.size( );
+ MFace face;
+ face.v1 = v1;
+ face.v2 = v2;
+ face.v3 = v3;
+ face.v4 = v4;
+ // TODO - Work out how materials work
+ face.mat_nr = 0;
+ triMesh->mface.push_back( face );
+ triMesh->totface = triMesh->mface.size( );
+}
+
+// ------------------------------------------------------------------------------------------------
+void BlenderBMeshConverter::AddTFace( const float* uv1, const float *uv2, const float *uv3, const float* uv4 )
+{
+ MTFace mtface;
+ memcpy( &mtface.uv[ 0 ], uv1, sizeof(float) * 2 );
+ memcpy( &mtface.uv[ 1 ], uv2, sizeof(float) * 2 );
+ memcpy( &mtface.uv[ 2 ], uv3, sizeof(float) * 2 );
+
+ if ( uv4 )
+ {
+ memcpy( &mtface.uv[ 3 ], uv4, sizeof(float) * 2 );
+ }
+
+ triMesh->mtface.push_back( mtface );
}
#endif // ASSIMP_BUILD_NO_BLEND_IMPORTER