CameraObj: load camera data in the correct way.
parent
82f73b6d03
commit
0d5eb30a28
|
@ -119,7 +119,7 @@ namespace Grammar {
|
||||||
IndexArrayToken,
|
IndexArrayToken,
|
||||||
MaterialToken,
|
MaterialToken,
|
||||||
ColorToken,
|
ColorToken,
|
||||||
Paramtype,
|
ParamToken,
|
||||||
TextureToken,
|
TextureToken,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -163,8 +163,13 @@ namespace Grammar {
|
||||||
return CameraNodeToken;
|
return CameraNodeToken;
|
||||||
} else if ( LightNodeType == tokenType ) {
|
} else if ( LightNodeType == tokenType ) {
|
||||||
return LightNodeToken;
|
return LightNodeToken;
|
||||||
} else if( GeometryObjectType == tokenType ) {
|
}
|
||||||
|
else if ( GeometryObjectType == tokenType ) {
|
||||||
return GeometryObjectToken;
|
return GeometryObjectToken;
|
||||||
|
} else if ( CameraObjectType == tokenType ) {
|
||||||
|
return CameraObjectToken;
|
||||||
|
} else if ( LightObjectType == tokenType ) {
|
||||||
|
return LightObjectToken;
|
||||||
} else if( TransformType == tokenType ) {
|
} else if( TransformType == tokenType ) {
|
||||||
return TransformToken;
|
return TransformToken;
|
||||||
} else if( MeshType == tokenType ) {
|
} else if( MeshType == tokenType ) {
|
||||||
|
@ -175,8 +180,10 @@ namespace Grammar {
|
||||||
return IndexArrayToken;
|
return IndexArrayToken;
|
||||||
} else if( MaterialType == tokenType ) {
|
} else if( MaterialType == tokenType ) {
|
||||||
return MaterialToken;
|
return MaterialToken;
|
||||||
} else if( ColorType == tokenType ) {
|
} else if ( ColorType == tokenType ) {
|
||||||
return ColorToken;
|
return ColorToken;
|
||||||
|
} else if ( ParamType == tokenType ) {
|
||||||
|
return ParamToken;
|
||||||
} else if( TextureType == tokenType ) {
|
} else if( TextureType == tokenType ) {
|
||||||
return TextureToken;
|
return TextureToken;
|
||||||
}
|
}
|
||||||
|
@ -304,6 +311,8 @@ void OpenGEXImporter::InternReadFile( const std::string &filename, aiScene *pSce
|
||||||
}
|
}
|
||||||
|
|
||||||
copyMeshes( pScene );
|
copyMeshes( pScene );
|
||||||
|
copyCameras( pScene );
|
||||||
|
copyLights( pScene );
|
||||||
resolveReferences();
|
resolveReferences();
|
||||||
createNodeTree( pScene );
|
createNodeTree( pScene );
|
||||||
}
|
}
|
||||||
|
@ -370,7 +379,7 @@ void OpenGEXImporter::handleNodes( DDLNode *node, aiScene *pScene ) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Grammar::LightObjectToken:
|
case Grammar::LightObjectToken:
|
||||||
handleCameraObject( *it, pScene );
|
handleLightObject( *it, pScene );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Grammar::TransformToken:
|
case Grammar::TransformToken:
|
||||||
|
@ -397,6 +406,10 @@ void OpenGEXImporter::handleNodes( DDLNode *node, aiScene *pScene ) {
|
||||||
handleColorNode( *it, pScene );
|
handleColorNode( *it, pScene );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Grammar::ParamToken:
|
||||||
|
handleParamNode( *it, pScene );
|
||||||
|
break;
|
||||||
|
|
||||||
case Grammar::TextureToken:
|
case Grammar::TextureToken:
|
||||||
handleTextureNode( *it, pScene );
|
handleTextureNode( *it, pScene );
|
||||||
break;
|
break;
|
||||||
|
@ -494,10 +507,14 @@ void OpenGEXImporter::handleObjectRefNode( DDLNode *node, aiScene *pScene ) {
|
||||||
|
|
||||||
std::vector<std::string> objRefNames;
|
std::vector<std::string> objRefNames;
|
||||||
getRefNames( node, objRefNames );
|
getRefNames( node, objRefNames );
|
||||||
m_currentNode->mNumMeshes = objRefNames.size();
|
|
||||||
m_currentNode->mMeshes = new unsigned int[ objRefNames.size() ];
|
// when we are dealing with a geometry node prepare the mesh cache
|
||||||
if( !objRefNames.empty() ) {
|
if ( m_tokenType == Grammar::GeometryNodeToken ) {
|
||||||
m_unresolvedRefStack.push_back( new RefInfo( m_currentNode, RefInfo::MeshRef, 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 ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -534,9 +551,9 @@ void OpenGEXImporter::handleCameraNode( DDLNode *node, aiScene *pScene ) {
|
||||||
m_currentCamera = camera;
|
m_currentCamera = camera;
|
||||||
|
|
||||||
aiNode *newNode = new aiNode;
|
aiNode *newNode = new aiNode;
|
||||||
|
pushNode( newNode, pScene );
|
||||||
m_tokenType = Grammar::CameraNodeToken;
|
m_tokenType = Grammar::CameraNodeToken;
|
||||||
m_currentNode = newNode;
|
m_currentNode = newNode;
|
||||||
pushNode( newNode, pScene );
|
|
||||||
|
|
||||||
handleNodes( node, pScene );
|
handleNodes( node, pScene );
|
||||||
|
|
||||||
|
@ -573,8 +590,8 @@ void OpenGEXImporter::handleGeometryObject( DDLNode *node, aiScene *pScene ) {
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
void OpenGEXImporter::handleCameraObject( ODDLParser::DDLNode *node, aiScene *pScene ) {
|
void OpenGEXImporter::handleCameraObject( ODDLParser::DDLNode *node, aiScene *pScene ) {
|
||||||
// parameters will be parsed normally in the tree, so just go for it
|
// parameters will be parsed normally in the tree, so just go for it
|
||||||
handleNodes( node, pScene );
|
|
||||||
|
|
||||||
|
handleNodes( node, pScene );
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
|
@ -962,13 +979,14 @@ void OpenGEXImporter::handleParamNode( ODDLParser::DDLNode *node, aiScene *pScen
|
||||||
if ( nullptr != prop ) {
|
if ( nullptr != prop ) {
|
||||||
if ( NULL != prop->m_value ) {
|
if ( NULL != prop->m_value ) {
|
||||||
Value *val( node->getValue() );
|
Value *val( node->getValue() );
|
||||||
if ( NULL != val ) {
|
const float floatVal( val->getFloat() );
|
||||||
if ( "fov" == val->getString() ) {
|
if ( NULL != val && prop->m_value != NULL ) {
|
||||||
|
if ( "fov" == prop->m_value->getString() ) {
|
||||||
} else if ( "near" == val->getString() ) {
|
m_currentCamera->mHorizontalFOV = floatVal;
|
||||||
|
} else if ( "near" == prop->m_value->getString() ) {
|
||||||
}else if ( "far" == val->getString() ) {
|
m_currentCamera->mClipPlaneNear = floatVal;
|
||||||
|
} else if ( "far" == prop->m_value->getString() ) {
|
||||||
|
m_currentCamera->mClipPlaneFar = floatVal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -977,6 +995,8 @@ void OpenGEXImporter::handleParamNode( ODDLParser::DDLNode *node, aiScene *pScen
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
void OpenGEXImporter::copyMeshes( aiScene *pScene ) {
|
void OpenGEXImporter::copyMeshes( aiScene *pScene ) {
|
||||||
|
ai_assert( nullptr != pScene );
|
||||||
|
|
||||||
if( m_meshCache.empty() ) {
|
if( m_meshCache.empty() ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -986,6 +1006,32 @@ void OpenGEXImporter::copyMeshes( aiScene *pScene ) {
|
||||||
std::copy( m_meshCache.begin(), m_meshCache.end(), pScene->mMeshes );
|
std::copy( m_meshCache.begin(), m_meshCache.end(), pScene->mMeshes );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------
|
||||||
|
void OpenGEXImporter::copyCameras( aiScene *pScene ) {
|
||||||
|
ai_assert( nullptr != pScene );
|
||||||
|
|
||||||
|
if ( m_cameraCache.empty() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pScene->mNumCameras = m_cameraCache.size();
|
||||||
|
pScene->mCameras = new aiCamera*[ pScene->mNumCameras ];
|
||||||
|
std::copy( m_cameraCache.begin(), m_cameraCache.end(), pScene->mCameras );
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------
|
||||||
|
void OpenGEXImporter::copyLights( aiScene *pScene ) {
|
||||||
|
ai_assert( nullptr != pScene );
|
||||||
|
|
||||||
|
if ( m_lightCache.empty() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pScene->mNumLights = m_lightCache.size();
|
||||||
|
pScene->mLights = new aiLight*[ pScene->mNumLights ];
|
||||||
|
std::copy( m_lightCache.begin(), m_lightCache.end(), pScene->mLights );
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
void OpenGEXImporter::resolveReferences() {
|
void OpenGEXImporter::resolveReferences() {
|
||||||
if( m_unresolvedRefStack.empty() ) {
|
if( m_unresolvedRefStack.empty() ) {
|
||||||
|
@ -999,7 +1045,7 @@ void OpenGEXImporter::resolveReferences() {
|
||||||
aiNode *node( currentRefInfo->m_node );
|
aiNode *node( currentRefInfo->m_node );
|
||||||
if( RefInfo::MeshRef == currentRefInfo->m_type ) {
|
if( RefInfo::MeshRef == currentRefInfo->m_type ) {
|
||||||
for( size_t i = 0; i < currentRefInfo->m_Names.size(); i++ ) {
|
for( size_t i = 0; i < currentRefInfo->m_Names.size(); i++ ) {
|
||||||
const std::string &name(currentRefInfo->m_Names[ i ] );
|
const std::string &name( currentRefInfo->m_Names[ i ] );
|
||||||
ReferenceMap::const_iterator it( m_mesh2refMap.find( name ) );
|
ReferenceMap::const_iterator it( m_mesh2refMap.find( name ) );
|
||||||
if( m_mesh2refMap.end() != it ) {
|
if( m_mesh2refMap.end() != it ) {
|
||||||
unsigned int meshIdx = m_mesh2refMap[ name ];
|
unsigned int meshIdx = m_mesh2refMap[ name ];
|
||||||
|
@ -1034,34 +1080,36 @@ void OpenGEXImporter::createNodeTree( aiScene *pScene ) {
|
||||||
void OpenGEXImporter::pushNode( aiNode *node, aiScene *pScene ) {
|
void OpenGEXImporter::pushNode( aiNode *node, aiScene *pScene ) {
|
||||||
ai_assert( NULL != pScene );
|
ai_assert( NULL != pScene );
|
||||||
|
|
||||||
if( NULL != node ) {
|
if ( NULL == node ) {
|
||||||
ChildInfo *info( NULL );
|
return;
|
||||||
if( m_nodeStack.empty() ) {
|
|
||||||
node->mParent = pScene->mRootNode;
|
|
||||||
NodeChildMap::iterator it( m_nodeChildMap.find( node->mParent ) );
|
|
||||||
if( m_nodeChildMap.end() == it ) {
|
|
||||||
info = new ChildInfo;
|
|
||||||
m_root = info;
|
|
||||||
m_nodeChildMap[ node->mParent ] = info;
|
|
||||||
} else {
|
|
||||||
info = it->second;
|
|
||||||
}
|
|
||||||
info->m_children.push_back( node );
|
|
||||||
} else {
|
|
||||||
aiNode *parent( m_nodeStack.back() );
|
|
||||||
ai_assert( NULL != parent );
|
|
||||||
node->mParent = parent;
|
|
||||||
NodeChildMap::iterator it( m_nodeChildMap.find( node->mParent ) );
|
|
||||||
if( m_nodeChildMap.end() == it ) {
|
|
||||||
info = new ChildInfo;
|
|
||||||
m_nodeChildMap[ node->mParent ] = info;
|
|
||||||
} else {
|
|
||||||
info = it->second;
|
|
||||||
}
|
|
||||||
info->m_children.push_back( node );
|
|
||||||
}
|
|
||||||
m_nodeStack.push_back( node );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChildInfo *info( NULL );
|
||||||
|
if( m_nodeStack.empty() ) {
|
||||||
|
node->mParent = pScene->mRootNode;
|
||||||
|
NodeChildMap::iterator it( m_nodeChildMap.find( node->mParent ) );
|
||||||
|
if( m_nodeChildMap.end() == it ) {
|
||||||
|
info = new ChildInfo;
|
||||||
|
m_root = info;
|
||||||
|
m_nodeChildMap[ node->mParent ] = info;
|
||||||
|
} else {
|
||||||
|
info = it->second;
|
||||||
|
}
|
||||||
|
info->m_children.push_back( node );
|
||||||
|
} else {
|
||||||
|
aiNode *parent( m_nodeStack.back() );
|
||||||
|
ai_assert( NULL != parent );
|
||||||
|
node->mParent = parent;
|
||||||
|
NodeChildMap::iterator it( m_nodeChildMap.find( node->mParent ) );
|
||||||
|
if( m_nodeChildMap.end() == it ) {
|
||||||
|
info = new ChildInfo;
|
||||||
|
m_nodeChildMap[ node->mParent ] = info;
|
||||||
|
} else {
|
||||||
|
info = it->second;
|
||||||
|
}
|
||||||
|
info->m_children.push_back( node );
|
||||||
|
}
|
||||||
|
m_nodeStack.push_back( node );
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -127,6 +127,9 @@ protected:
|
||||||
void handleTextureNode( ODDLParser::DDLNode *node, aiScene *pScene );
|
void handleTextureNode( ODDLParser::DDLNode *node, aiScene *pScene );
|
||||||
void handleParamNode( ODDLParser::DDLNode *node, aiScene *pScene );
|
void handleParamNode( ODDLParser::DDLNode *node, aiScene *pScene );
|
||||||
void copyMeshes( aiScene *pScene );
|
void copyMeshes( aiScene *pScene );
|
||||||
|
void copyCameras( aiScene *pScene );
|
||||||
|
void copyLights( aiScene *pScene );
|
||||||
|
|
||||||
void resolveReferences();
|
void resolveReferences();
|
||||||
void pushNode( aiNode *node, aiScene *pScene );
|
void pushNode( aiNode *node, aiScene *pScene );
|
||||||
aiNode *popNode();
|
aiNode *popNode();
|
||||||
|
|
Loading…
Reference in New Issue