待定

 // Desc: 在这里是调用了成员函数 GenerateSkinnedMesh(pMeshContainer);
//       是在这里加载了蒙皮信息
//-----------------------------------------------------------------------------
HRESULT CAllocateHierarchy::CreateMeshContainer( LPCSTR Name,
                                                 CONST D3DXMESHDATA *pMeshData,
                                                 CONST D3DXMATERIAL *pMaterials,
                                                 CONST D3DXEFFECTINSTANCE *pEffectInstances,
                                                 DWORD NumMaterials,
                                                 CONST DWORD *pAdjacency,
                                                 LPD3DXSKININFO pSkinInfo,
                                                 LPD3DXMESHCONTAINER *ppNewMeshContainer)
{
 HRESULT hr;
    D3DXMESHCONTAINER_DERIVED *pMeshContainer = NULL;
    UINT NumFaces;       //网格中的面数,在填充网格容器结构的邻接信息成员时使用
    UINT iMaterial;      //纹理操作时的循环变量
    UINT cBones;         //当前网格模型骨骼总数
    LPDIRECT3DDEVICE9 pd3dDevice = NULL;
    LPD3DXMESH pMesh    = NULL;
    *ppNewMeshContainer = NULL;

    if (pMeshData->Type != D3DXMESHTYPE_MESH)
    {
        return E_FAIL;
    }

    pMesh = pMeshData->pMesh;
 
    if (pMesh->GetFVF() == 0)
    {
        return E_FAIL;
    }

    //为网格容器分配内存
    pMeshContainer = new D3DXMESHCONTAINER_DERIVED;
    if (pMeshContainer == NULL)
    {
        return E_OUTOFMEMORY;
    }
    memset(pMeshContainer, 0, sizeof(D3DXMESHCONTAINER_DERIVED));

    //填充网格容器结构D3DXMESHCONTAINER_DERIVED的成员

 //为网格指定名称
 hr = AllocateName(Name, &pMeshContainer->Name);
 if (FAILED(hr))
 {
  DestroyMeshContainer(pMeshContainer);
  return hr;
 }     
 
    pMesh->GetDevice(&pd3dDevice);
    NumFaces = pMesh->GetNumFaces();

    //确保网格顶点包含法线
    if (!(pMesh->GetFVF() & D3DFVF_NORMAL))
    {
        pMeshContainer->MeshData.Type = D3DXMESHTYPE_MESH;
        hr = pMesh->CloneMeshFVF( pMesh->GetOptions(),
                         pMesh->GetFVF() | D3DFVF_NORMAL,
                         pd3dDevice,
                         &pMeshContainer->MeshData.pMesh );
  if (FAILED(hr))
  {
   SAFE_RELEASE(pd3dDevice);
   DestroyMeshContainer(pMeshContainer);
   return hr;
  }

  pMesh = pMeshContainer->MeshData.pMesh;
        D3DXComputeNormals( pMesh, NULL );
    }
    else
    {
        pMeshContainer->MeshData.pMesh = pMesh;
        pMeshContainer->MeshData.Type = D3DXMESHTYPE_MESH;
        pMesh->AddRef();
    }

    //为网格模型准备材质和纹理
    pMeshContainer->NumMaterials = max(1, NumMaterials);
    pMeshContainer->pMaterials = new D3DXMATERIAL[pMeshContainer->NumMaterials];
    pMeshContainer->ppTextures = new LPDIRECT3DTEXTURE9[pMeshContainer->NumMaterials];
    pMeshContainer->pAdjacency = new DWORD[NumFaces*3];
    if ((pMeshContainer->pAdjacency == NULL) || (pMeshContainer->pMaterials == NULL)
  || (pMeshContainer->ppTextures == NULL))
 {
  hr = E_OUTOFMEMORY;
  SAFE_RELEASE(pd3dDevice);
  DestroyMeshContainer(pMeshContainer);
  return hr;
 }

    memcpy(pMeshContainer->pAdjacency, pAdjacency, sizeof(DWORD) * NumFaces*3);
    memset(pMeshContainer->ppTextures, 0, sizeof(LPDIRECT3DTEXTURE9) * pMeshContainer->NumMaterials);

    if (NumMaterials > 0)           
    {
  //复制材质属性, 设置材质环境光属性
        memcpy(pMeshContainer->pMaterials, pMaterials, sizeof(D3DXMATERIAL) * NumMaterials);
  pMeshContainer->pMaterials->MatD3D.Ambient = pMeshContainer->pMaterials->MatD3D.Diffuse;

        for (iMaterial = 0; iMaterial < NumMaterials; iMaterial++)
        {
            if (pMeshContainer->pMaterials[iMaterial].pTextureFilename != NULL)
            {
    WCHAR strTexturePath[MAX_PATH];
                WCHAR wszBuf[MAX_PATH];
    //从纹理文件路径提取纹理文件名
    RemovePathFromFileName(pMeshContainer->pMaterials[iMaterial].pTextureFilename, wszBuf);
                //根据纹理文件名从事先指定的路径查找纹理文件
    DXUTFindDXSDKMediaFileCch( strTexturePath, MAX_PATH, wszBuf );
                if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, strTexturePath,
                                                        &pMeshContainer->ppTextures[iMaterial] ) ) )
                    pMeshContainer->ppTextures[iMaterial] = NULL;

                pMeshContainer->pMaterials[iMaterial].pTextureFilename = NULL;
            }
        }
    }
    else
    {
        pMeshContainer->pMaterials[0].pTextureFilename = NULL;
        memset(&pMeshContainer->pMaterials[0].MatD3D, 0, sizeof(D3DMATERIAL9));
        pMeshContainer->pMaterials[0].MatD3D.Diffuse.r = 0.5f;
        pMeshContainer->pMaterials[0].MatD3D.Diffuse.g = 0.5f;
        pMeshContainer->pMaterials[0].MatD3D.Diffuse.b = 0.5f;
        pMeshContainer->pMaterials[0].MatD3D.Specular = pMeshContainer->pMaterials[0].MatD3D.Diffuse;
    }

     //如果当前网格包含蒙皮信息
    if (pSkinInfo != NULL)
    {
        //加载蒙皮网格信息
        pMeshContainer->pSkinInfo = pSkinInfo;
        pSkinInfo->AddRef();

        //保留原网格信息
        pMeshContainer->pOrigMesh = pMesh;
        pMesh->AddRef();

        //获取骨骼数量
        cBones = pSkinInfo->GetNumBones();

  //为每块骨骼分配保存初始变换矩阵的内存空间
        pMeshContainer->pBoneOffsetMatrices = new D3DXMATRIX[cBones];
        if (pMeshContainer->pBoneOffsetMatrices == NULL)
        {
   hr = E_OUTOFMEMORY;
   DestroyMeshContainer(pMeshContainer);
   return hr;
  }

        //保存每块骨骼的初始变换矩阵
        for (UINT iBone = 0; iBone < cBones; iBone++)
        {
            pMeshContainer->pBoneOffsetMatrices[iBone] = *(pMeshContainer->pSkinInfo->GetBoneOffsetMatrix(iBone));
        }

  //生成蒙皮网格模型
        hr = GenerateSkinnedMesh(pd3dDevice, pMeshContainer);
        if (FAILED(hr))
  {
   DestroyMeshContainer(pMeshContainer);
   return hr;
  }
    }

    *ppNewMeshContainer = pMeshContainer;
    pMeshContainer = NULL;
    SAFE_RELEASE(pd3dDevice);
    return hr;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值