closes https://github.com/assimp/assimp/issues/954: add import of vertex
colors in penGEX-importer.pull/1015/head
parent
3245d2d804
commit
78dae87de2
|
@ -223,17 +223,19 @@ static void propId2StdString( Property *prop, std::string &name, std::string &ke
|
||||||
OpenGEXImporter::VertexContainer::VertexContainer()
|
OpenGEXImporter::VertexContainer::VertexContainer()
|
||||||
: m_numVerts( 0 )
|
: m_numVerts( 0 )
|
||||||
, m_vertices( nullptr )
|
, m_vertices( nullptr )
|
||||||
|
, m_numColors( 0 )
|
||||||
|
, m_colors( nullptr )
|
||||||
, m_numNormals( 0 )
|
, m_numNormals( 0 )
|
||||||
, m_normals( nullptr )
|
, m_normals( nullptr )
|
||||||
, m_numUVComps()
|
, m_numUVComps()
|
||||||
, m_textureCoords()
|
, m_textureCoords() {
|
||||||
{
|
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
OpenGEXImporter::VertexContainer::~VertexContainer() {
|
OpenGEXImporter::VertexContainer::~VertexContainer() {
|
||||||
delete[] m_vertices;
|
delete[] m_vertices;
|
||||||
|
delete[] m_colors;
|
||||||
delete[] m_normals;
|
delete[] m_normals;
|
||||||
|
|
||||||
for(auto &texcoords : m_textureCoords) {
|
for(auto &texcoords : m_textureCoords) {
|
||||||
|
@ -710,6 +712,7 @@ void OpenGEXImporter::handleMeshNode( ODDLParser::DDLNode *node, aiScene *pScene
|
||||||
enum MeshAttribute {
|
enum MeshAttribute {
|
||||||
None,
|
None,
|
||||||
Position,
|
Position,
|
||||||
|
Color,
|
||||||
Normal,
|
Normal,
|
||||||
TexCoord
|
TexCoord
|
||||||
};
|
};
|
||||||
|
@ -718,8 +721,10 @@ enum MeshAttribute {
|
||||||
static MeshAttribute getAttributeByName( const char *attribName ) {
|
static MeshAttribute getAttributeByName( const char *attribName ) {
|
||||||
ai_assert( nullptr != attribName );
|
ai_assert( nullptr != attribName );
|
||||||
|
|
||||||
if( 0 == strncmp( "position", attribName, strlen( "position" ) ) ) {
|
if ( 0 == strncmp( "position", attribName, strlen( "position" ) ) ) {
|
||||||
return Position;
|
return Position;
|
||||||
|
} else if ( 0 == strncmp( "color", attribName, strlen( "color" ) ) ) {
|
||||||
|
return Color;
|
||||||
} else if( 0 == strncmp( "normal", attribName, strlen( "normal" ) ) ) {
|
} else if( 0 == strncmp( "normal", attribName, strlen( "normal" ) ) ) {
|
||||||
return Normal;
|
return Normal;
|
||||||
} else if( 0 == strncmp( "texcoord", attribName, strlen( "texcoord" ) ) ) {
|
} else if( 0 == strncmp( "texcoord", attribName, strlen( "texcoord" ) ) ) {
|
||||||
|
@ -747,6 +752,22 @@ static void fillVector3( aiVector3D *vec3, Value *vals ) {
|
||||||
vec3->Set( x, y, z );
|
vec3->Set( x, y, z );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------
|
||||||
|
static void fillColor4( aiColor4D *col4, Value *vals ) {
|
||||||
|
ai_assert( nullptr != col4 );
|
||||||
|
ai_assert( nullptr != vals );
|
||||||
|
|
||||||
|
float r( 0.0f ), g( 0.0f ), b( 0.0f ), a ( 1.0f );
|
||||||
|
Value *next( vals );
|
||||||
|
col4->r = next->getFloat();
|
||||||
|
next = next->m_next;
|
||||||
|
col4->g = next->getFloat();
|
||||||
|
next = next->m_next;
|
||||||
|
col4->b = next->getFloat();
|
||||||
|
next = next->m_next;
|
||||||
|
col4->a = next->getFloat();
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
static size_t countDataArrayListItems( DataArrayList *vaList ) {
|
static size_t countDataArrayListItems( DataArrayList *vaList ) {
|
||||||
size_t numItems( 0 );
|
size_t numItems( 0 );
|
||||||
|
@ -774,6 +795,14 @@ static void copyVectorArray( size_t numItems, DataArrayList *vaList, aiVector3D
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------
|
||||||
|
static void copyColor4DArray( size_t numItems, DataArrayList *vaList, aiColor4D *colArray ) {
|
||||||
|
for ( size_t i = 0; i < numItems; i++ ) {
|
||||||
|
Value *next( vaList->m_dataList );
|
||||||
|
fillColor4( &colArray[ i ], next );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
void OpenGEXImporter::handleVertexArrayNode( ODDLParser::DDLNode *node, aiScene *pScene ) {
|
void OpenGEXImporter::handleVertexArrayNode( ODDLParser::DDLNode *node, aiScene *pScene ) {
|
||||||
if( nullptr == node ) {
|
if( nullptr == node ) {
|
||||||
|
@ -801,6 +830,10 @@ void OpenGEXImporter::handleVertexArrayNode( ODDLParser::DDLNode *node, aiScene
|
||||||
m_currentVertices.m_numVerts = numItems;
|
m_currentVertices.m_numVerts = numItems;
|
||||||
m_currentVertices.m_vertices = new aiVector3D[ numItems ];
|
m_currentVertices.m_vertices = new aiVector3D[ numItems ];
|
||||||
copyVectorArray( numItems, vaList, m_currentVertices.m_vertices );
|
copyVectorArray( numItems, vaList, m_currentVertices.m_vertices );
|
||||||
|
} else if ( Color == attribType ) {
|
||||||
|
m_currentVertices.m_numColors = numItems;
|
||||||
|
m_currentVertices.m_colors = new aiColor4D[ numItems ];
|
||||||
|
copyColor4DArray( numItems, vaList, m_currentVertices.m_colors );
|
||||||
} else if( Normal == attribType ) {
|
} else if( Normal == attribType ) {
|
||||||
m_currentVertices.m_numNormals = numItems;
|
m_currentVertices.m_numNormals = numItems;
|
||||||
m_currentVertices.m_normals = new aiVector3D[ numItems ];
|
m_currentVertices.m_normals = new aiVector3D[ numItems ];
|
||||||
|
@ -835,6 +868,11 @@ void OpenGEXImporter::handleIndexArrayNode( ODDLParser::DDLNode *node, aiScene *
|
||||||
m_currentMesh->mFaces = new aiFace[ numItems ];
|
m_currentMesh->mFaces = new aiFace[ numItems ];
|
||||||
m_currentMesh->mNumVertices = numItems * 3;
|
m_currentMesh->mNumVertices = numItems * 3;
|
||||||
m_currentMesh->mVertices = new aiVector3D[ m_currentMesh->mNumVertices ];
|
m_currentMesh->mVertices = new aiVector3D[ m_currentMesh->mNumVertices ];
|
||||||
|
bool hasColors( false );
|
||||||
|
if ( m_currentVertices.m_numColors > 0 ) {
|
||||||
|
m_currentMesh->mColors[0] = new aiColor4D[ m_currentVertices.m_numColors ];
|
||||||
|
hasColors = true;
|
||||||
|
}
|
||||||
bool hasNormalCoords( false );
|
bool hasNormalCoords( false );
|
||||||
if ( m_currentVertices.m_numNormals > 0 ) {
|
if ( m_currentVertices.m_numNormals > 0 ) {
|
||||||
m_currentMesh->mNormals = new aiVector3D[ m_currentMesh->mNumVertices ];
|
m_currentMesh->mNormals = new aiVector3D[ m_currentMesh->mNumVertices ];
|
||||||
|
@ -858,6 +896,10 @@ void OpenGEXImporter::handleIndexArrayNode( ODDLParser::DDLNode *node, aiScene *
|
||||||
ai_assert( index < m_currentMesh->mNumVertices );
|
ai_assert( index < m_currentMesh->mNumVertices );
|
||||||
aiVector3D &pos = ( m_currentVertices.m_vertices[ idx ] );
|
aiVector3D &pos = ( m_currentVertices.m_vertices[ idx ] );
|
||||||
m_currentMesh->mVertices[ index ].Set( pos.x, pos.y, pos.z );
|
m_currentMesh->mVertices[ index ].Set( pos.x, pos.y, pos.z );
|
||||||
|
if ( hasColors ) {
|
||||||
|
aiColor4D &col = m_currentVertices.m_colors[ idx ];
|
||||||
|
m_currentMesh->mColors[ 0 ][ index ] = col;
|
||||||
|
}
|
||||||
if ( hasNormalCoords ) {
|
if ( hasNormalCoords ) {
|
||||||
aiVector3D &normal = ( m_currentVertices.m_normals[ idx ] );
|
aiVector3D &normal = ( m_currentVertices.m_normals[ idx ] );
|
||||||
m_currentMesh->mNormals[ index ].Set( normal.x, normal.y, normal.z );
|
m_currentMesh->mNormals[ index ].Set( normal.x, normal.y, normal.z );
|
||||||
|
|
|
@ -142,6 +142,8 @@ private:
|
||||||
struct VertexContainer {
|
struct VertexContainer {
|
||||||
size_t m_numVerts;
|
size_t m_numVerts;
|
||||||
aiVector3D *m_vertices;
|
aiVector3D *m_vertices;
|
||||||
|
size_t m_numColors;
|
||||||
|
aiColor4D *m_colors;
|
||||||
size_t m_numNormals;
|
size_t m_numNormals;
|
||||||
aiVector3D *m_normals;
|
aiVector3D *m_normals;
|
||||||
size_t m_numUVComps[ AI_MAX_NUMBER_OF_TEXTURECOORDS ];
|
size_t m_numUVComps[ AI_MAX_NUMBER_OF_TEXTURECOORDS ];
|
||||||
|
|
Loading…
Reference in New Issue