瀏覽代碼

implementation for mesh resolving.

Signed-off-by: Kim Kulling <[email protected]>
Kim Kulling 10 年之前
父節點
當前提交
59633d172f
共有 1 個文件被更改,包括 92 次插入7 次删除
  1. 92 7
      code/OpenGEXImporter.cpp

+ 92 - 7
code/OpenGEXImporter.cpp

@@ -162,12 +162,21 @@ namespace OpenGEX {
 
 
 USE_ODDLPARSER_NS
 USE_ODDLPARSER_NS
 
 
+//------------------------------------------------------------------------------------------------
+OpenGEXImporter::RefInfo::RefInfo( aiNode *node, Type type, std::vector<std::string> &names )
+: m_node( node )
+, m_type( type )
+, m_Names( names ) {
+    // empty
+}
+
 //------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------
 OpenGEXImporter::OpenGEXImporter() 
 OpenGEXImporter::OpenGEXImporter() 
 : m_meshCache()
 : m_meshCache()
 , m_mesh2refMap()
 , m_mesh2refMap()
 , m_ctx( NULL )
 , m_ctx( NULL )
-, m_currentNode( NULL ) {
+, m_currentNode( NULL )
+, m_unresolvedRefStack() {
     // empty
     // empty
 }
 }
 
 
@@ -246,7 +255,12 @@ void OpenGEXImporter::handleNodes( DDLNode *node, aiScene *pScene ) {
                 break;
                 break;
 
 
             case Grammar::MaterialRefToken:
             case Grammar::MaterialRefToken:
+                handleMaterialRefNode( *it, pScene );
+                break;
+
             case Grammar::MetricKeyToken:
             case Grammar::MetricKeyToken:
+                break;
+
             case Grammar::GeometryNodeToken:
             case Grammar::GeometryNodeToken:
                 handleGeometryNode( *it, pScene );
                 handleGeometryNode( *it, pScene );
                 break;
                 break;
@@ -256,12 +270,27 @@ void OpenGEXImporter::handleNodes( DDLNode *node, aiScene *pScene ) {
                 break;
                 break;
 
 
             case Grammar::TransformToken:
             case Grammar::TransformToken:
+                break;
+
             case Grammar::MeshToken:
             case Grammar::MeshToken:
+                break;
+
             case Grammar::VertexArrayToken:
             case Grammar::VertexArrayToken:
+                break;
+
             case Grammar::IndexArrayToken:
             case Grammar::IndexArrayToken:
+                break;
+
             case Grammar::MaterialToken:
             case Grammar::MaterialToken:
+                handleMaterial( *it, pScene );
+                break;
+
             case Grammar::ColorToken:
             case Grammar::ColorToken:
+                break;
+
             case Grammar::TextureToken:
             case Grammar::TextureToken:
+                break;
+            
             default:
             default:
                 break;
                 break;
         }
         }
@@ -290,7 +319,7 @@ void OpenGEXImporter::handleMetricNode( DDLNode *node, aiScene *pScene ) {
                         if( Value::ddl_float == val->m_type ) {
                         if( Value::ddl_float == val->m_type ) {
                             m_metrics[ type ].m_floatValue = val->getFloat();
                             m_metrics[ type ].m_floatValue = val->getFloat();
                         } else if( Value::ddl_int32 == val->m_type ) {
                         } else if( Value::ddl_int32 == val->m_type ) {
-                            m_metrics[ type ].m_floatValue = val->getInt32();
+                            m_metrics[ type ].m_intValue = val->getInt32();
                         } else if( Value::ddl_string == val->m_type ) {
                         } else if( Value::ddl_string == val->m_type ) {
                             m_metrics[type].m_stringValue = std::string( val->getString() );
                             m_metrics[type].m_stringValue = std::string( val->getString() );
                         } else {
                         } else {
@@ -323,20 +352,53 @@ void OpenGEXImporter::handleNameNode( DDLNode *node, aiScene *pScene ) {
 }
 }
 
 
 //------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------
-void OpenGEXImporter::handleObjectRefNode( DDLNode *node, aiScene *pScene ) {
-    if( NULL == m_currentNode ) {
-        throw DeadlyImportError( "No parent node for name." );
-        return;
-    }
+static void getRefNames( DDLNode *node, std::vector<std::string> &names ) {
+    ai_assert( NULL != node );
 
 
     Reference *ref = node->getReferences();
     Reference *ref = node->getReferences();
     if( NULL != ref ) {
     if( NULL != ref ) {
         for( size_t i = 0; i < ref->m_numRefs; i++ )  {
         for( size_t i = 0; i < ref->m_numRefs; i++ )  {
             Name *currentName( ref->m_referencedName[ i ] );
             Name *currentName( ref->m_referencedName[ i ] );
+            if( NULL != currentName && NULL != currentName->m_id ) {
+                const std::string name( currentName->m_id->m_buffer );
+                if( !name.empty() ) {
+                    names.push_back( name );
+                }
+            }
         }
         }
     }
     }
 }
 }
 
 
+//------------------------------------------------------------------------------------------------
+void OpenGEXImporter::handleObjectRefNode( DDLNode *node, aiScene *pScene ) {
+    if( NULL == m_currentNode ) {
+        throw DeadlyImportError( "No parent node for name." );
+        return;
+    }
+
+    std::vector<std::string> objRefNames;
+    getRefNames( node, objRefNames );
+    m_currentNode->mNumMeshes = objRefNames.size();
+    m_currentNode->mMeshes = new unsigned int[ objRefNames.size() ];
+    if( !objRefNames.empty() ) {
+        m_unresolvedRefStack.push_back( new RefInfo( m_currentNode, RefInfo::MeshRef, objRefNames ) );
+    }
+}
+
+//------------------------------------------------------------------------------------------------
+void OpenGEXImporter::handleMaterialRefNode( ODDLParser::DDLNode *node, aiScene *pScene ) {
+    if( NULL == m_currentNode ) {
+        throw DeadlyImportError( "No parent node for name." );
+        return;
+    }
+
+    std::vector<std::string> matRefNames;
+    getRefNames( node, matRefNames );
+    if( !matRefNames.empty() ) {
+        m_unresolvedRefStack.push_back( new RefInfo( m_currentNode, RefInfo::MaterialRef, matRefNames ) );
+    }
+}
+
 //------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------
 void OpenGEXImporter::handleGeometryNode( DDLNode *node, aiScene *pScene ) {
 void OpenGEXImporter::handleGeometryNode( DDLNode *node, aiScene *pScene ) {
     m_currentNode = new aiNode;
     m_currentNode = new aiNode;
@@ -351,12 +413,35 @@ void OpenGEXImporter::handleGeometryObject( DDLNode *node, aiScene *pScene ) {
 
 
     // store name to reference relation
     // store name to reference relation
     m_mesh2refMap[ node->getName() ] = idx;
     m_mesh2refMap[ node->getName() ] = idx;
+}
+
+//------------------------------------------------------------------------------------------------
+void OpenGEXImporter::handleMaterial( ODDLParser::DDLNode *node, aiScene *pScene ) {
 
 
 }
 }
 
 
 //------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------
 void OpenGEXImporter::resolveReferences() {
 void OpenGEXImporter::resolveReferences() {
+    if( m_unresolvedRefStack.empty() ) {
+        return;
+    }
 
 
+    RefInfo *currentRefInfo( NULL );
+    for( std::vector<RefInfo*>::iterator it = m_unresolvedRefStack.begin(); it != m_unresolvedRefStack.end(); ++it ) {
+        currentRefInfo = *it;
+        if( NULL != currentRefInfo ) {
+            aiNode *node( currentRefInfo->m_node );
+            if( RefInfo::MeshRef == currentRefInfo->m_type ) {
+                for( size_t i = 0; i < currentRefInfo->m_Names.size(); i++ ) {
+                    const std::string &name(currentRefInfo->m_Names[ i ] );
+                    unsigned int meshIdx = m_mesh2refMap[ name ];
+                    node->mMeshes[ i ] = meshIdx;
+                }
+            } else if( RefInfo::MaterialRef == currentRefInfo->m_type ) {
+                // ToDo
+            }
+        }
+    }
 }
 }
 
 
 //------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------