1 #include "MeshBuilder.hpp"
2 #include "mof/private/GraphicsDeviceImpl.hpp"
3 #include "mof/ConsoleIO.hpp"
5 #include "mof/private/MeshDisposer.hpp"
6 #include <boost/shared_ptr.hpp>
8 #include "mof/FilePath.hpp"
9 #include "mof/private/VertexFVF.hpp"
10 #include "mof/Material.hpp"
11 #include "mof/Texture.hpp"
12 #include "mof/private/Mesh.hpp"
14 struct mof::MeshBuilder::Impl{
15 boost::shared_ptr<mof::MeshDisposer> pMeshDisposer;
16 unsigned long nMaterials;
17 boost::shared_ptr<Material>* materials;
18 boost::shared_ptr<Texture>* textures;
22 : pMeshDisposer() , nMaterials(0) ,
23 materials(NULL) , textures(NULL){
33 mof::MeshBuilder::MeshBuilder(const mof::tstring& path )
37 LPDIRECT3DDEVICE9 pDevice = mof::GraphicsDevice::getRawDevice();
39 LPD3DXBUFFER pD3DXMtrlBuffer; //
\83}
\83e
\83\8a\83A
\83\8b\97p
\83o
\83b
\83t
\83@
40 m_pImpl->pMeshDisposer = boost::shared_ptr<mof::MeshDisposer>( new mof::MeshDisposer() );
42 //
\83t
\83@
\83C
\83\8b\83\8d\81[
\83h
43 hr = D3DXLoadMeshFromX(path.c_str() , D3DXMESH_MANAGED, pDevice,
44 &(m_pImpl->pMeshDisposer->pAdjacency) ,
45 &pD3DXMtrlBuffer , NULL,
46 &(m_pImpl->nMaterials) ,
47 &(m_pImpl->pMeshDisposer->pMesh) );
48 if(hr != D3D_OK)throw std::invalid_argument("Failed --- D3DXLoadMeshFromX");
50 //
\8ae
\8eí
\83C
\83\93\83X
\83^
\83\93\83X
\8eæ
\93¾
51 D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
53 m_pImpl->materials = new boost::shared_ptr<mof::Material>[m_pImpl->nMaterials];
54 m_pImpl->textures = new boost::shared_ptr<mof::Texture>[m_pImpl->nMaterials];
57 for( DWORD i = 0; i< m_pImpl->nMaterials; i++ )
59 //
\83}
\83e
\83\8a\83A
\83\8b\82Ì
\83R
\83s
\81[
60 D3DMATERIAL9 mat = d3dxMaterials[i].MatD3D;
61 mat.Ambient = mat.Diffuse;
64 static_cast<void*>(&tmp) ,
65 static_cast<const void*>(&mat) ,
69 boost::shared_ptr<mof::Material> p(new mof::Material(tmp));
70 m_pImpl->materials[i] = p;
72 //
\83e
\83N
\83X
\83`
\83\83\83t
\83@
\83C
\83\8b\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
73 if( d3dxMaterials[i].pTextureFilename != NULL &&
74 lstrlen(d3dxMaterials[i].pTextureFilename) > 0 )
76 mof::otstringstream os;
77 mof::FilePath path(path);
78 os << path.dir().c_str() << _T("/") << d3dxMaterials[i].pTextureFilename;
79 m_pImpl->textures[i] = boost::shared_ptr<mof::Texture>(new mof::Texture( os.str()));
84 catch( std::exception& e){
85 pD3DXMtrlBuffer->Release(); //
\83o
\83b
\83t
\83@
\89ð
\95ú
88 pD3DXMtrlBuffer->Release(); //
\83o
\83b
\83t
\83@
\89ð
\95ú
90 LPD3DXMESH pMesh = NULL;
91 if(m_pImpl->pMeshDisposer->pMesh->GetFVF() != mof::getFVF<VertexXYZNUV>())
93 //
\83\81\83b
\83V
\83\85\82É
\96@
\90ü
\82ª
\82È
\82¢
\8fê
\8d\87\8f\91\82«
\8d\9e\82Þ
94 m_pImpl->pMeshDisposer->pMesh->CloneMeshFVF(
95 m_pImpl->pMeshDisposer->pMesh->GetOptions() ,
96 mof::getFVF<VertexXYZNUV>() ,
99 LPD3DXMESH tmp = m_pImpl->pMeshDisposer->pMesh;
100 m_pImpl->pMeshDisposer->pMesh = pMesh;
106 mof::MeshBuilder::~MeshBuilder(){}
108 mof::Graphics3D* mof::MeshBuilder::construct() const{
109 return new mof::Mesh(
110 m_pImpl->pMeshDisposer ,
111 m_pImpl->nMaterials ,