Exemple #1
0
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);
}
Exemple #2
0
//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;

}