Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void MainFrame::DoObjExportScene( Castor::Path const & p_pathFile )const
- {
- StringStream l_mtl, l_obj;
- Version l_version;
- StringStream l_streamVersion;
- l_streamVersion << l_version.m_iMajor << cuT( "." ) << l_version.m_iMinor << cuT( "." ) << l_version.m_iBuild;
- // First we export the materials
- Path l_pathFileMtl( p_pathFile );
- str_utils::replace( l_pathFileMtl, l_pathFileMtl.GetExtension(), cuT( "mtl" ) );
- MaterialManager const & l_mtlManager = m_pCastor3D->GetMaterialManager();
- l_mtl << cuT( "#######################################################\n" );
- l_mtl << cuT( "# MTL File generated by CastorViewer v" ) + l_streamVersion.str() + cuT( " #\n" );
- l_mtl << cuT( "#######################################################\n\n" );
- l_mtlManager.lock();
- std::for_each( l_mtlManager.begin(), l_mtlManager.end(), [&]( std::pair< String, MaterialSPtr > p_pair )
- {
- l_mtl << DoObjExport( l_pathFileMtl.GetPath(), p_pair.second ) + cuT( "\n" );
- } );
- l_mtlManager.unlock();
- TextFile l_fileMtl( l_pathFileMtl, File::eOPEN_MODE_WRITE, File::eENCODING_MODE_ASCII );
- l_fileMtl.WriteText( l_mtl.str() );
- // Then we export meshes
- Path l_pathFileObj( p_pathFile );
- str_utils::replace( l_pathFileObj, l_pathFileObj.GetExtension(), cuT( "obj" ) );
- MeshCollection const & l_mshManager = m_pCastor3D->GetMeshManager();
- uint32_t l_uiOffset = 1;
- uint32_t l_uiCount = 0;
- l_obj << cuT( "#######################################################\n" );
- l_obj << cuT( "# OBJ File generated by CastorViewer v" ) + l_streamVersion.str() + cuT( " #\n" );
- l_obj << cuT( "#######################################################\n\n" );
- l_obj << cuT( "mtllib " ) + l_pathFileMtl.GetFullFileName() + cuT( "\n\n" );
- l_mshManager.lock();
- for ( MeshCollection::TObjPtrMapConstIt l_it = l_mshManager.begin(); l_it != l_mshManager.end(); ++l_it )
- {
- l_obj << DoObjExport( l_it->second, l_uiOffset, l_uiCount ) << cuT( "\n" );
- }
- l_mshManager.unlock();
- TextFile l_fileObj( l_pathFileObj, File::eOPEN_MODE_WRITE, File::eENCODING_MODE_ASCII );
- l_fileObj.WriteText( l_obj.str() );
- }
- Path GetTextureNewPath( Path const & p_pathSrcFile, Path const & p_pathFolder )
- {
- Path l_pathReturn( cuT( "Texture" ) );
- l_pathReturn /= p_pathSrcFile.GetFullFileName();
- if ( !wxDirExists( ( p_pathFolder / cuT( "Texture" ) ).c_str() ) )
- {
- wxMkDir( str_utils::to_str( p_pathFolder / cuT( "Texture" ) ).c_str(), 0777 );
- }
- if ( wxFileExists( p_pathSrcFile ) )
- {
- Logger::LogDebug( cuT( "Copying [" ) + p_pathSrcFile + cuT( "] to [" ) + p_pathFolder / l_pathReturn + cuT( "]" ) );
- wxCopyFile( p_pathSrcFile, p_pathFolder / l_pathReturn );
- }
- return l_pathReturn;
- };
- String MainFrame::DoObjExport( Path const & p_pathMtlFolder, MaterialSPtr p_pMaterial )const
- {
- StringStream l_strReturn;
- PassSPtr l_pPass = p_pMaterial->GetPass( 0 );
- if ( l_pPass )
- {
- Colour l_clAmbient = l_pPass->GetAmbient();
- Colour l_clDiffuse = l_pPass->GetDiffuse();
- Colour l_clSpecular = l_pPass->GetSpecular();
- TextureUnitSPtr l_pAmbient = l_pPass->GetTextureUnit( eTEXTURE_CHANNEL_AMBIENT );
- TextureUnitSPtr l_pDiffuse = l_pPass->GetTextureUnit( eTEXTURE_CHANNEL_DIFFUSE );
- TextureUnitSPtr l_pNormal = l_pPass->GetTextureUnit( eTEXTURE_CHANNEL_NORMAL );
- TextureUnitSPtr l_pOpacity = l_pPass->GetTextureUnit( eTEXTURE_CHANNEL_OPACITY );
- TextureUnitSPtr l_pSpecular = l_pPass->GetTextureUnit( eTEXTURE_CHANNEL_SPECULAR );
- TextureUnitSPtr l_pGloss = l_pPass->GetTextureUnit( eTEXTURE_CHANNEL_GLOSS );
- l_strReturn << cuT( "newmtl " ) << p_pMaterial->GetName() << cuT( "\n" );
- l_strReturn << cuT( " Ka " ) << l_clAmbient.red().value() << cuT( " " ) << l_clAmbient.green().value() << cuT( " " ) << l_clAmbient.blue().value() << cuT( "\n" );
- l_strReturn << cuT( " Kd " ) << l_clDiffuse.red().value() << cuT( " " ) << l_clDiffuse.green().value() << cuT( " " ) << l_clDiffuse.blue().value() << cuT( "\n" );
- l_strReturn << cuT( " Ks " ) << l_clSpecular.red().value() << cuT( " " ) << l_clSpecular.green().value() << cuT( " " ) << l_clSpecular.blue().value() << cuT( "\n" );
- l_strReturn << cuT( " Ns " ) << l_pPass->GetShininess() << cuT( "\n" );
- l_strReturn << cuT( " d " ) << l_pPass->GetAlpha() << cuT( "\n" );
- if ( l_pAmbient && !l_pAmbient->GetTexturePath().empty() )
- {
- l_strReturn << cuT( " map_Ka " ) + GetTextureNewPath( l_pAmbient->GetTexturePath(), p_pathMtlFolder ) << cuT( "\n" );
- }
- if ( l_pDiffuse && !l_pDiffuse->GetTexturePath().empty() )
- {
- l_strReturn << cuT( " map_Kd " ) + GetTextureNewPath( l_pDiffuse->GetTexturePath(), p_pathMtlFolder ) << cuT( "\n" );
- }
- if ( l_pNormal && !l_pNormal->GetTexturePath().empty() )
- {
- l_strReturn << cuT( " map_Bump " ) + GetTextureNewPath( l_pNormal->GetTexturePath(), p_pathMtlFolder ) << cuT( "\n" );
- }
- if ( l_pOpacity && !l_pOpacity->GetTexturePath().empty() )
- {
- l_strReturn << cuT( " map_d " ) + GetTextureNewPath( l_pOpacity->GetTexturePath(), p_pathMtlFolder ) << cuT( "\n" );
- }
- if ( l_pSpecular && !l_pSpecular->GetTexturePath().empty() )
- {
- l_strReturn << cuT( " map_Ks " ) + GetTextureNewPath( l_pSpecular->GetTexturePath(), p_pathMtlFolder ) << cuT( "\n" );
- }
- if ( l_pGloss && !l_pGloss->GetTexturePath().empty() )
- {
- l_strReturn << cuT( " map_Ns " ) + GetTextureNewPath( l_pGloss->GetTexturePath(), p_pathMtlFolder ) << cuT( "\n" );
- }
- }
- return l_strReturn.str();
- }
- String MainFrame::DoObjExport( MeshSPtr p_pMesh, uint32_t & p_uiOffset, uint32_t & p_uiCount )const
- {
- StringStream l_strReturn;
- std::for_each( p_pMesh->Begin(), p_pMesh->End(), [&]( SubmeshSPtr p_pSubmesh )
- {
- StringStream l_strV;
- StringStream l_strVT;
- StringStream l_strVN;
- StringStream l_strF;
- SubmeshRendererSPtr l_pRenderer = p_pSubmesh->GetRenderer();
- VertexBuffer & l_vtxBuffer = l_pRenderer->GetGeometryBuffers()->GetVertexBuffer();
- IndexBuffer & l_idxBuffer = l_pRenderer->GetGeometryBuffers()->GetIndexBuffer();
- uint32_t l_uiStride = l_vtxBuffer.GetDeclaration().GetStride();
- uint32_t l_uiNbPoints = l_vtxBuffer.GetSize() / l_uiStride;
- uint32_t l_uiNbFaces = l_idxBuffer.GetSize() / 3;
- uint8_t * l_pVtx = l_vtxBuffer.data();
- uint32_t * l_pIdx = l_idxBuffer.data();
- Point3r l_ptPos;
- Point3r l_ptNml;
- Point3r l_ptTex;
- for ( uint32_t j = 0; j < l_uiNbPoints; j++ )
- {
- real * l_pVertex = reinterpret_cast< real * >( &l_pVtx[j * l_uiStride] );
- Vertex::GetPosition( l_pVertex, l_ptPos );
- Vertex::GetNormal( l_pVertex, l_ptNml );
- Vertex::GetTexCoord( l_pVertex, l_ptTex );
- l_strV << cuT( "v " ) << l_ptPos[0] << " " << l_ptPos[1] << " " << l_ptPos[2] << cuT( "\n" );
- l_strVN << cuT( "vn " ) << l_ptNml[0] << " " << l_ptNml[1] << " " << l_ptNml[2] << cuT( "\n" );
- l_strVT << cuT( "vt " ) << l_ptTex[0] << " " << l_ptTex[1] << cuT( "\n" );
- }
- l_strF << cuT( "usemtl " ) << p_pSubmesh->GetDefaultMaterial()->GetName() << cuT( "\ns off\n" );
- for ( uint32_t j = 0; j < l_uiNbFaces; j++ )
- {
- uint32_t * l_pFace = &l_pIdx[j * 3];
- uint32_t l_v0 = p_uiOffset + l_pFace[0];
- uint32_t l_v1 = p_uiOffset + l_pFace[1];
- uint32_t l_v2 = p_uiOffset + l_pFace[2];
- l_strF << cuT( "f " ) << l_v0 << cuT( "/" ) << l_v0 << cuT( "/" ) << l_v0 << cuT( " " ) << l_v1 << cuT( "/" ) << l_v1 << cuT( "/" ) << l_v1 << cuT( " " ) << l_v2 << cuT( "/" ) << l_v2 << cuT( "/" ) << l_v2 << cuT( "\n" );
- }
- l_strReturn << cuT( "g mesh" ) << p_uiCount << cuT( "\n" ) << l_strV.str() << cuT( "\n" ) << l_strVN.str() << cuT( "\n" ) << l_strVT.str() << cuT( "\n" ) << l_strF.str() << cuT( "\n" );
- p_uiOffset += l_uiNbPoints;
- p_uiCount++;
- } );
- return l_strReturn.str();
- }
Advertisement
Add Comment
Please, Sign In to add comment