diff --git a/code/OpenGEXImporter.cpp b/code/OpenGEXImporter.cpp index 2ddc401a4..2653bf9f9 100644 --- a/code/OpenGEXImporter.cpp +++ b/code/OpenGEXImporter.cpp @@ -41,6 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "OpenGEXImporter.h" #include "DefaultIOSystem.h" +#include #include "MakeVerboseFormat.h" #include @@ -63,36 +64,41 @@ static const aiImporterDesc desc = { }; namespace Grammar { - static const std::string MetricType = "Metric"; + static const std::string MetricType = "Metric"; static const std::string Metric_DistanceType = "distance"; - static const std::string Metric_AngleType = "angle"; - static const std::string Metric_TimeType = "time"; - static const std::string Metric_UpType = "up"; - static const std::string NameType = "Name"; - static const std::string ObjectRefType = "ObjectRef"; - static const std::string MaterialRefType = "MaterialRef"; - static const std::string MetricKeyType = "key"; - static const std::string GeometryNodeType = "GeometryNode"; - static const std::string GeometryObjectType = "GeometryObject"; - static const std::string TransformType = "Transform"; - static const std::string MeshType = "Mesh"; - static const std::string VertexArrayType = "VertexArray"; - static const std::string IndexArrayType = "IndexArray"; - static const std::string MaterialType = "Material"; - static const std::string ColorType = "Color"; - static const std::string DiffuseColorToken = "diffuse"; + static const std::string Metric_AngleType = "angle"; + static const std::string Metric_TimeType = "time"; + static const std::string Metric_UpType = "up"; + static const std::string NameType = "Name"; + static const std::string ObjectRefType = "ObjectRef"; + static const std::string MaterialRefType = "MaterialRef"; + static const std::string MetricKeyType = "key"; + static const std::string GeometryNodeType = "GeometryNode"; + static const std::string CameraNodeType = "CameraNode"; + static const std::string LightNodeType = "LightNode"; + static const std::string GeometryObjectType = "GeometryObject"; + static const std::string CameraObjectType = "CameraObject"; + static const std::string LightObjectType = "LightObject"; + static const std::string TransformType = "Transform"; + static const std::string MeshType = "Mesh"; + static const std::string VertexArrayType = "VertexArray"; + static const std::string IndexArrayType = "IndexArray"; + static const std::string MaterialType = "Material"; + static const std::string ColorType = "Color"; + static const std::string ParamType = "Param"; + static const std::string TextureType = "Texture"; + + static const std::string DiffuseColorToken = "diffuse"; static const std::string SpecularColorToken = "specular"; static const std::string EmissionColorToken = "emission"; - static const std::string DiffuseTextureToken = "diffuse"; + static const std::string DiffuseTextureToken = "diffuse"; static const std::string DiffuseSpecularTextureToken = "specular"; - static const std::string SpecularPowerTextureToken = "specular_power"; - static const std::string EmissionTextureToken = "emission"; - static const std::string OpacyTextureToken = "opacity"; - static const std::string TransparencyTextureToken = "transparency"; - static const std::string NormalTextureToken = "normal"; - - static const char *TextureType = "Texture"; + static const std::string SpecularPowerTextureToken = "specular_power"; + static const std::string EmissionTextureToken = "emission"; + static const std::string OpacyTextureToken = "opacity"; + static const std::string TransparencyTextureToken = "transparency"; + static const std::string NormalTextureToken = "normal"; enum TokenType { NoneType = -1, @@ -102,14 +108,19 @@ namespace Grammar { MaterialRefToken, MetricKeyToken, GeometryNodeToken, + CameraNodeToken, + LightNodeToken, GeometryObjectToken, + CameraObjectToken, + LightObjectToken, TransformToken, MeshToken, VertexArrayToken, IndexArrayToken, MaterialToken, ColorToken, - TextureToken + Paramtype, + TextureToken, }; static const std::string ValidMetricToken[ 4 ] = { @@ -146,8 +157,12 @@ namespace Grammar { return MaterialRefToken; } else if( MetricKeyType == tokenType ) { return MetricKeyToken; - } else if( GeometryNodeType == tokenType ) { + } else if ( GeometryNodeType == tokenType ) { return GeometryNodeToken; + } else if ( CameraNodeType == tokenType ) { + return CameraNodeToken; + } else if ( LightNodeType == tokenType ) { + return LightNodeToken; } else if( GeometryObjectType == tokenType ) { return GeometryObjectToken; } else if( TransformType == tokenType ) { @@ -192,6 +207,7 @@ OpenGEXImporter::VertexContainer::VertexContainer() OpenGEXImporter::VertexContainer::~VertexContainer() { delete[] m_vertices; delete[] m_normals; + for( size_t i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; i++ ) { delete [] m_textureCoords[ i ]; } @@ -223,6 +239,9 @@ OpenGEXImporter::OpenGEXImporter() , m_currentMesh( NULL ) , m_currentMaterial( NULL ) , m_tokenType( Grammar::NoneType ) +, m_materialCache() +, m_cameraCache() +, m_lightCache() , m_nodeStack() , m_unresolvedRefStack() { // empty @@ -317,6 +336,14 @@ void OpenGEXImporter::handleNodes( DDLNode *node, aiScene *pScene ) { handleGeometryNode( *it, pScene ); break; + case Grammar::CameraNodeToken: + handleCameraNode( *it, pScene ); + break; + + case Grammar::LightNodeToken: + handleLightNode( *it, pScene ); + break; + case Grammar::GeometryObjectToken: handleGeometryObject( *it, pScene ); break; @@ -394,7 +421,7 @@ void OpenGEXImporter::handleMetricNode( DDLNode *node, aiScene *pScene ) { //------------------------------------------------------------------------------------------------ void OpenGEXImporter::handleNameNode( DDLNode *node, aiScene *pScene ) { if( NULL == m_currentNode ) { - throw DeadlyImportError( "No parent node for name." ); + throw DeadlyImportError( "No current node for name." ); return; } @@ -406,12 +433,12 @@ void OpenGEXImporter::handleNameNode( DDLNode *node, aiScene *pScene ) { } const std::string name( val->getString() ); - if( m_tokenType == Grammar::GeometryNodeToken ) { + if( m_tokenType == Grammar::GeometryNodeToken || m_tokenType == Grammar::LightNodeToken + || m_tokenType == Grammar::CameraNodeToken ) { m_currentNode->mName.Set( name.c_str() ); } else if( m_tokenType == Grammar::MaterialToken ) { } - } } @@ -474,8 +501,48 @@ void OpenGEXImporter::handleGeometryNode( DDLNode *node, aiScene *pScene ) { popNode(); } +//------------------------------------------------------------------------------------------------ +void OpenGEXImporter::handleCameraNode( DDLNode *node, aiScene *pScene ) { + aiCamera *camera( new aiCamera ); + const size_t camIdx( m_cameraCache.size() ); + m_cameraCache.push_back( camera ); + +} + +//------------------------------------------------------------------------------------------------ +void OpenGEXImporter::handleLightNode( ODDLParser::DDLNode *node, aiScene *pScene ) { + aiLight *light( new aiLight ); + const size_t lightIdx( m_lightCache.size() ); + m_lightCache.push_back( light ); + + aiNode *newNode = new aiNode; + m_tokenType = Grammar::LightNodeToken; + m_currentNode = newNode; + pushNode( newNode, pScene ); + + handleNodes( node, pScene ); + + popNode(); + + light->mName.Set( newNode->mName.C_Str() ); +} + //------------------------------------------------------------------------------------------------ void OpenGEXImporter::handleGeometryObject( DDLNode *node, aiScene *pScene ) { + // parameters will be parsed normally in the tree, so just go for it + handleNodes( node, pScene ); +} + +//------------------------------------------------------------------------------------------------ +void OpenGEXImporter::handleCameraObject( ODDLParser::DDLNode *node, aiScene *pScene ) { + // parameters will be parsed normally in the tree, so just go for it + handleNodes( node, pScene ); + +} + +//------------------------------------------------------------------------------------------------ +void OpenGEXImporter::handleLightObject( ODDLParser::DDLNode *node, aiScene *pScene ) { + // parameters will be parsed normally in the tree, so just go for it handleNodes( node, pScene ); } @@ -513,7 +580,6 @@ static void setMatrix( aiNode *node, DataArrayList *transformData ) { node->mTransformation.d2 = m[ 7 ]; node->mTransformation.d3 = m[ 11 ]; node->mTransformation.d4 = m[ 15 ]; - } //------------------------------------------------------------------------------------------------ @@ -523,7 +589,6 @@ void OpenGEXImporter::handleTransformNode( ODDLParser::DDLNode *node, aiScene *p return; } - DataArrayList *transformData( node->getDataArrayList() ); if( NULL != transformData ) { if( transformData->m_numItems != 16 ) { @@ -560,8 +625,16 @@ void OpenGEXImporter::handleMeshNode( ODDLParser::DDLNode *node, aiScene *pScene std::string propName, propKey; propId2StdString( prop, propName, propKey ); if( "primitive" == propName ) { - if( "triangles" == propKey ) { + if ( "points" == propKey ) { + m_currentMesh->mPrimitiveTypes |= aiPrimitiveType_POINT; + } else if ( "lines" == propKey ) { + m_currentMesh->mPrimitiveTypes |= aiPrimitiveType_LINE; + } else if( "triangles" == propKey ) { m_currentMesh->mPrimitiveTypes |= aiPrimitiveType_TRIANGLE; + } else if ( "quads" == propKey ) { + m_currentMesh->mPrimitiveTypes |= aiPrimitiveType_POLYGON; + } else { + DefaultLogger::get()->warn( propKey + " is not supported primitive type." ); } } } @@ -839,9 +912,7 @@ void OpenGEXImporter::handleTextureNode( ODDLParser::DDLNode *node, aiScene *pSc // m_currentMaterial->AddProperty( &tex, AI_MATKEY_TEXTURE_DIFFUSE( 0 ) ); } else if( prop->m_value->getString() == Grammar::NormalTextureToken ) { m_currentMaterial->AddProperty( &tex, AI_MATKEY_TEXTURE_NORMALS( 0 ) ); - - } - else { + } else { ai_assert( false ); } } diff --git a/code/OpenGEXImporter.h b/code/OpenGEXImporter.h index bcb87b7e0..5de2277b2 100644 --- a/code/OpenGEXImporter.h +++ b/code/OpenGEXImporter.h @@ -52,8 +52,11 @@ namespace ODDLParser { class DDLNode; struct Context; } + struct aiNode; struct aiMaterial; +struct aiCamera; +struct aiLight; namespace Assimp { namespace OpenGEX { @@ -110,7 +113,11 @@ protected: void handleObjectRefNode( ODDLParser::DDLNode *node, aiScene *pScene ); void handleMaterialRefNode( ODDLParser::DDLNode *node, aiScene *pScene ); void handleGeometryNode( ODDLParser::DDLNode *node, aiScene *pScene ); + void handleCameraNode( ODDLParser::DDLNode *node, aiScene *pScene ); + void handleLightNode( ODDLParser::DDLNode *node, aiScene *pScene ); void handleGeometryObject( ODDLParser::DDLNode *node, aiScene *pScene ); + void handleCameraObject( ODDLParser::DDLNode *node, aiScene *pScene ); + void handleLightObject( ODDLParser::DDLNode *node, aiScene *pScene ); void handleTransformNode( ODDLParser::DDLNode *node, aiScene *pScene ); void handleMeshNode( ODDLParser::DDLNode *node, aiScene *pScene ); void handleVertexArrayNode( ODDLParser::DDLNode *node, aiScene *pScene ); @@ -181,6 +188,8 @@ private: aiMaterial *m_currentMaterial; int m_tokenType; std::vector m_materialCache; + std::vector m_cameraCache; + std::vector m_lightCache; std::vector m_nodeStack; std::vector m_unresolvedRefStack; };