-#include "MeshBuilder.hpp"\r
-#include "mof/private/GraphicsDeviceImpl.hpp"\r
-#include "mof/ConsoleIO.hpp"\r
-#include <stdexcept>\r
-#include "mof/private/MeshDisposer.hpp"\r
-#include <memory>\r
-#include <stdlib.h>\r
-#include "mof/FilePath.hpp"\r
-#include "mof/private/VertexFVF.hpp"\r
-#include "mof/Material.hpp"\r
-#include "mof/Texture.hpp"\r
-#include "mof/private/Mesh.hpp"\r
-\r
-struct mof::MeshBuilder::Impl{\r
- std::shared_ptr<mof::MeshDisposer> pMeshDisposer;\r
- unsigned long nMaterials;\r
- std::shared_ptr<Material>* materials;\r
- std::shared_ptr<Texture>* textures;\r
-\r
-\r
- Impl()\r
- : pMeshDisposer() , nMaterials(0) ,\r
- materials(NULL) , textures(NULL){\r
- }\r
-\r
- ~Impl(){\r
- delete[] materials;\r
- delete[] textures;\r
- }\r
-\r
-};\r
-\r
-mof::MeshBuilder::MeshBuilder(const mof::tstring& path )\r
-: m_pImpl(new Impl())\r
-{\r
-\r
- LPDIRECT3DDEVICE9 pDevice = mof::GraphicsDevice::getRawDevice();\r
- HRESULT hr;\r
- LPD3DXBUFFER pD3DXMtrlBuffer; //\83}\83e\83\8a\83A\83\8b\97p\83o\83b\83t\83@\r
- m_pImpl->pMeshDisposer = std::shared_ptr<mof::MeshDisposer>( new mof::MeshDisposer() );\r
-\r
- //\83t\83@\83C\83\8b\83\8d\81[\83h\r
- hr = D3DXLoadMeshFromX(path.c_str() , D3DXMESH_MANAGED, pDevice,\r
- &(m_pImpl->pMeshDisposer->pAdjacency) ,\r
- &pD3DXMtrlBuffer , NULL, \r
- &(m_pImpl->nMaterials) , \r
- &(m_pImpl->pMeshDisposer->pMesh) );\r
- if(hr != D3D_OK)throw std::invalid_argument("Failed --- D3DXLoadMeshFromX");\r
-\r
- //\8ae\8eí\83C\83\93\83X\83^\83\93\83X\8eæ\93¾\r
- D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();\r
- try{\r
- m_pImpl->materials = new std::shared_ptr<mof::Material>[m_pImpl->nMaterials];\r
- m_pImpl->textures = new std::shared_ptr<mof::Texture>[m_pImpl->nMaterials];\r
- \r
- \r
- for( DWORD i = 0; i< m_pImpl->nMaterials; i++ )\r
- {\r
- //\83}\83e\83\8a\83A\83\8b\82Ì\83R\83s\81[\r
- D3DMATERIAL9 mat = d3dxMaterials[i].MatD3D;\r
- mat.Ambient = mat.Diffuse;\r
- mof::Material tmp;\r
- memcpy(\r
- static_cast<void*>(&tmp) , \r
- static_cast<const void*>(&mat) ,\r
- sizeof(D3DMATERIAL9)\r
- );\r
- \r
- std::shared_ptr<mof::Material> p(new mof::Material(tmp));\r
- m_pImpl->materials[i] = p;\r
-\r
- //\83e\83N\83X\83`\83\83\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý\r
- if( d3dxMaterials[i].pTextureFilename != NULL && \r
- lstrlen(d3dxMaterials[i].pTextureFilename) > 0 )\r
- {\r
- mof::otstringstream os;\r
- mof::FilePath path(path);\r
- os << path.dir().c_str() << _T("/") << d3dxMaterials[i].pTextureFilename;\r
- m_pImpl->textures[i] = std::shared_ptr<mof::Texture>(new mof::Texture( os.str()));\r
- }\r
- }\r
-\r
- }\r
- catch( std::exception& e){\r
- pD3DXMtrlBuffer->Release(); //\83o\83b\83t\83@\89ð\95ú\r
- throw e;\r
- }\r
- pD3DXMtrlBuffer->Release(); //\83o\83b\83t\83@\89ð\95ú\r
-\r
- LPD3DXMESH pMesh = NULL;\r
- if(m_pImpl->pMeshDisposer->pMesh->GetFVF() != mof::getFVF<VertexXYZNUV>())\r
- {\r
- //\83\81\83b\83V\83\85\82É\96@\90ü\82ª\82È\82¢\8fê\8d\87\8f\91\82«\8d\9e\82Þ\r
- m_pImpl->pMeshDisposer->pMesh->CloneMeshFVF(\r
- m_pImpl->pMeshDisposer->pMesh->GetOptions() ,\r
- mof::getFVF<VertexXYZNUV>() ,\r
- pDevice , &pMesh );\r
- \r
- LPD3DXMESH tmp = m_pImpl->pMeshDisposer->pMesh;\r
- m_pImpl->pMeshDisposer->pMesh = pMesh;\r
- tmp->Release();\r
- }\r
-\r
-}\r
- \r
-mof::MeshBuilder::~MeshBuilder(){}\r
-\r
-mof::Graphics3D* mof::MeshBuilder::construct() const{\r
- return new mof::Mesh(\r
- m_pImpl->pMeshDisposer ,\r
- m_pImpl->nMaterials , \r
- m_pImpl->materials ,\r
- m_pImpl->textures \r
- );\r
-}\r
+#include "MeshBuilder.hpp"
+#include "mof/private/GraphicsDeviceImpl.hpp"
+#include "mof/ConsoleIO.hpp"
+#include <stdexcept>
+#include "mof/private/MeshDisposer.hpp"
+#include <memory>
+#include <stdlib.h>
+#include "mof/FilePath.hpp"
+#include "mof/private/VertexFVF.hpp"
+#include "mof/Material.hpp"
+#include "mof/Texture.hpp"
+#include "mof/private/Mesh.hpp"
+
+struct mof::MeshBuilder::Impl{
+ std::shared_ptr<mof::MeshDisposer> pMeshDisposer;
+ unsigned long nMaterials;
+ std::shared_ptr<Material>* materials;
+ std::shared_ptr<Texture>* textures;
+
+
+ Impl()
+ : pMeshDisposer() , nMaterials(0) ,
+ materials(NULL) , textures(NULL){
+ }
+
+ ~Impl(){
+ delete[] materials;
+ delete[] textures;
+ }
+
+};
+
+mof::MeshBuilder::MeshBuilder(const mof::tstring& path )
+: m_pImpl(new Impl())
+{
+
+ LPDIRECT3DDEVICE9 pDevice = mof::GraphicsDevice::getRawDevice();
+ HRESULT hr;
+ LPD3DXBUFFER pD3DXMtrlBuffer; //\83}\83e\83\8a\83A\83\8b\97p\83o\83b\83t\83@
+ m_pImpl->pMeshDisposer = std::shared_ptr<mof::MeshDisposer>( new mof::MeshDisposer() );
+
+ //\83t\83@\83C\83\8b\83\8d\81[\83h
+ hr = D3DXLoadMeshFromX(path.c_str() , D3DXMESH_MANAGED, pDevice,
+ &(m_pImpl->pMeshDisposer->pAdjacency) ,
+ &pD3DXMtrlBuffer , NULL,
+ &(m_pImpl->nMaterials) ,
+ &(m_pImpl->pMeshDisposer->pMesh) );
+ if(hr != D3D_OK)throw std::invalid_argument("Failed --- D3DXLoadMeshFromX");
+
+ //\8ae\8eí\83C\83\93\83X\83^\83\93\83X\8eæ\93¾
+ D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
+ try{
+ m_pImpl->materials = new std::shared_ptr<mof::Material>[m_pImpl->nMaterials];
+ m_pImpl->textures = new std::shared_ptr<mof::Texture>[m_pImpl->nMaterials];
+
+
+ for( DWORD i = 0; i< m_pImpl->nMaterials; i++ )
+ {
+ //\83}\83e\83\8a\83A\83\8b\82Ì\83R\83s\81[
+ D3DMATERIAL9 mat = d3dxMaterials[i].MatD3D;
+ mat.Ambient = mat.Diffuse;
+ mof::Material tmp;
+ memcpy(
+ static_cast<void*>(&tmp) ,
+ static_cast<const void*>(&mat) ,
+ sizeof(D3DMATERIAL9)
+ );
+
+ std::shared_ptr<mof::Material> p(new mof::Material(tmp));
+ m_pImpl->materials[i] = p;
+
+ //\83e\83N\83X\83`\83\83\83t\83@\83C\83\8b\82Ì\93Ç\82Ý\8d\9e\82Ý
+ if( d3dxMaterials[i].pTextureFilename != NULL &&
+ lstrlen(d3dxMaterials[i].pTextureFilename) > 0 )
+ {
+ mof::otstringstream os;
+ mof::FilePath path(path);
+ os << path.dir().c_str() << _T("/") << d3dxMaterials[i].pTextureFilename;
+ m_pImpl->textures[i] = std::shared_ptr<mof::Texture>(new mof::Texture( os.str()));
+ }
+ }
+
+ }
+ catch( std::exception& e){
+ pD3DXMtrlBuffer->Release(); //\83o\83b\83t\83@\89ð\95ú
+ throw e;
+ }
+ pD3DXMtrlBuffer->Release(); //\83o\83b\83t\83@\89ð\95ú
+
+ LPD3DXMESH pMesh = NULL;
+ if(m_pImpl->pMeshDisposer->pMesh->GetFVF() != mof::getFVF<VertexXYZNUV>())
+ {
+ //\83\81\83b\83V\83\85\82É\96@\90ü\82ª\82È\82¢\8fê\8d\87\8f\91\82«\8d\9e\82Þ
+ m_pImpl->pMeshDisposer->pMesh->CloneMeshFVF(
+ m_pImpl->pMeshDisposer->pMesh->GetOptions() ,
+ mof::getFVF<VertexXYZNUV>() ,
+ pDevice , &pMesh );
+
+ LPD3DXMESH tmp = m_pImpl->pMeshDisposer->pMesh;
+ m_pImpl->pMeshDisposer->pMesh = pMesh;
+ tmp->Release();
+ }
+
+}
+
+mof::MeshBuilder::~MeshBuilder(){}
+
+mof::Graphics3D* mof::MeshBuilder::construct() const{
+ return new mof::Mesh(
+ m_pImpl->pMeshDisposer ,
+ m_pImpl->nMaterials ,
+ m_pImpl->materials ,
+ m_pImpl->textures
+ );
+}