OSDN Git Service

rm latex/
[moflib/moflib.git] / oldmof / MeshBuilder.cpp
1 #include "MeshBuilder.hpp"
2 #include "mof/private/GraphicsDeviceImpl.hpp"
3 #include "mof/ConsoleIO.hpp"
4 #include <stdexcept>
5 #include "mof/private/MeshDisposer.hpp"
6 #include <boost/shared_ptr.hpp>
7 #include <stdlib.h>
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"
13
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;
19
20
21         Impl()
22                 : pMeshDisposer() , nMaterials(0) ,
23                   materials(NULL) , textures(NULL){
24         }
25
26         ~Impl(){
27                 delete[] materials;
28                 delete[] textures;
29         }
30
31 };
32
33 mof::MeshBuilder::MeshBuilder(const mof::tstring& path )
34 : m_pImpl(new Impl())
35 {
36
37         LPDIRECT3DDEVICE9 pDevice = mof::GraphicsDevice::getRawDevice();
38         HRESULT hr;
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() );
41
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");
49
50         //\8ae\8eí\83C\83\93\83X\83^\83\93\83X\8eæ\93¾
51         D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
52         try{
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];
55                 
56         
57                 for( DWORD i = 0; i< m_pImpl->nMaterials; i++ )
58                         {
59                         //\83}\83e\83\8a\83A\83\8b\82Ì\83R\83s\81[
60                         D3DMATERIAL9 mat = d3dxMaterials[i].MatD3D;
61                         mat.Ambient = mat.Diffuse;
62                         mof::Material tmp;
63                         memcpy(
64                                 static_cast<void*>(&tmp) , 
65                                 static_cast<const void*>(&mat) ,
66                                 sizeof(D3DMATERIAL9)
67                                 );
68                         
69                         boost::shared_ptr<mof::Material> p(new mof::Material(tmp));
70                         m_pImpl->materials[i] = p;
71
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 )
75                         {
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()));
80                         }
81                 }
82
83         }
84         catch( std::exception& e){
85                 pD3DXMtrlBuffer->Release();     //\83o\83b\83t\83@\89ð\95ú
86                 throw e;
87         }
88         pD3DXMtrlBuffer->Release();     //\83o\83b\83t\83@\89ð\95ú
89
90         LPD3DXMESH pMesh = NULL;
91         if(m_pImpl->pMeshDisposer->pMesh->GetFVF() != mof::getFVF<VertexXYZNUV>())
92         {
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>() ,
97                         pDevice , &pMesh );
98         
99                 LPD3DXMESH tmp = m_pImpl->pMeshDisposer->pMesh;
100                 m_pImpl->pMeshDisposer->pMesh = pMesh;
101                 tmp->Release();
102         }
103
104 }
105         
106 mof::MeshBuilder::~MeshBuilder(){}
107
108 mof::Graphics3D* mof::MeshBuilder::construct() const{
109         return new mof::Mesh(
110                 m_pImpl->pMeshDisposer ,
111                 m_pImpl->nMaterials , 
112                 m_pImpl->materials ,
113                 m_pImpl->textures 
114                 );
115 }