void Model::CreateFromXFile(ID3D11Device* device, LPCWSTR fileName, const WCHAR* normalMapSuffix, bool generateNormals, bool generateTangentFrame, Mesh::IndexType idxType) { _ASSERT(FileExists(fileName)); IDirect3DDevice9Ptr d3d9Device = CreateD3D9Device(); // Load the D3DX mesh ID3DXMesh* d3dxMesh = NULL; ID3DXBuffer* adjacencyBuffer = NULL; ID3DXBuffer* materialsBuffer = NULL; DWORD numMaterials = 0; UINT options = D3DXMESH_MANAGED; if (idxType == Mesh::Index32Bit) options |= D3DXMESH_32BIT; DXCall(D3DXLoadMeshFromXW(fileName, options, d3d9Device, &adjacencyBuffer, &materialsBuffer, NULL, &numMaterials, &d3dxMesh)); IUnknownReleaser<ID3DXMesh> meshReleaser(d3dxMesh); IUnknownReleaser<ID3DXBuffer> adjReleaser(adjacencyBuffer); IUnknownReleaser<ID3DXBuffer> matReleaser(materialsBuffer); DWORD* initalAdjacency = reinterpret_cast<DWORD*>(adjacencyBuffer->GetBufferPointer()); D3DXMATERIAL* materials = reinterpret_cast<D3DXMATERIAL*>(materialsBuffer->GetBufferPointer()); // Get the directory the mesh was loaded from wstring fileDirectory = GetDirectoryFromFileName(fileName); // Convert materials for (UINT i = 0; i < numMaterials; ++i) { MeshMaterial material; D3DXMATERIAL& srcMaterial = materials[i]; material.AmbientAlbedo = XMFLOAT3(reinterpret_cast<float*>(&srcMaterial.MatD3D.Ambient)); material.DiffuseAlbedo = XMFLOAT3(reinterpret_cast<float*>(&srcMaterial.MatD3D.Diffuse)); material.SpecularAlbedo = XMFLOAT3(reinterpret_cast<float*>(&srcMaterial.MatD3D.Specular)); material.Emissive = XMFLOAT3(reinterpret_cast<float*>(&srcMaterial.MatD3D.Emissive)); material.SpecularPower = srcMaterial.MatD3D.Power; material.Alpha = srcMaterial.MatD3D.Diffuse.a; material.DiffuseMapName = AnsiToWString(srcMaterial.pTextureFilename); // Add the normal map prefix if (normalMapSuffix && material.DiffuseMapName.length() > 0) { wstring base = GetFileNameWithoutExtension(material.DiffuseMapName.c_str()); wstring extension = GetFileExtension(material.DiffuseMapName.c_str()); material.NormalMapName = base + normalMapSuffix + L"." + extension; } LoadMaterialResources(material, fileDirectory, device); } // Make a single mesh Mesh mesh; mesh.CreateFromD3DXMesh(fileDirectory, device, d3d9Device, d3dxMesh, generateNormals, generateTangentFrame, initalAdjacency, idxType); meshes.push_back(mesh); }
//Xファイル読み込み BOOL X_FILE::XfileLoader(LPCWSTR name) { D3DXLoadMeshFromXW(name, D3DXMESH_SYSTEMMEM,pDevice3D, NULL, &pD3DXMatrlBuffer, NULL, &MaterialNum, &g_pMesh); //もしXファイルがなければ if (g_pMesh == NULL) { MessageBox(NULL,_T("メッシュがないよ!"),_T("Mesh.exe"),MB_OK); //falseを返す return FALSE; } return TRUE; }