2024年DirectX12(D3D12)基础教程(十七)—(5)

UINT nMeshCnt = stMeshData.m_paiModel->mNumMeshes;
if ( 0 == nMeshCnt )
{
	ATLTRACE("文件(%s)中没有网格数据!\n", pszFileName);
	return FALSE;
}

const aiMesh\* paiSubMesh = nullptr;
const aiVector3D	Zero3D(0.0f, 0.0f, 0.0f);
UINT nNumBones = 0;
UINT nNumVertices = 0;
UINT nNumIndices = 0;

stMeshData.m_arSubMeshInfo.SetCount(nMeshCnt);

// 加载Vertex基本信息
for (UINT i = 0; i < nMeshCnt; i++)
{
	paiSubMesh = stMeshData.m_paiModel->mMeshes[i];

	stMeshData.m_arSubMeshInfo[i].m_nMaterialIndex = paiSubMesh->mMaterialIndex;
	stMeshData.m_arSubMeshInfo[i].m_nNumIndices = paiSubMesh->mNumFaces \* GRS_INDICES_PER_FACE;
	stMeshData.m_arSubMeshInfo[i].m_nBaseVertex = nNumVertices;
	stMeshData.m_arSubMeshInfo[i].m_nBaseIndex = nNumIndices;

	// 当前Mesh的顶点数量和索引数量累加后,就是下个Mesh顶点和索引在整体缓冲中的索引开始位置
	nNumVertices	+= stMeshData.m_paiModel->mMeshes[i]->mNumVertices;
	nNumIndices		+= stMeshData.m_arSubMeshInfo[i].m_nNumIndices;		

	// 加载顶点常规数据
	for (UINT j = 0; j < paiSubMesh->mNumVertices; j++)
	{
		stMeshData.m_arPositions.Add(XMFLOAT4(paiSubMesh->mVertices[j].x
			, paiSubMesh->mVertices[j].y
			, paiSubMesh->mVertices[j].z
			, 1.0f));

		stMeshData.m_arNormals.Add(XMFLOAT4(paiSubMesh->mNormals[j].x
			, paiSubMesh->mNormals[j].y
			, paiSubMesh->mNormals[j].z
			, 0.0f));

		// 注意这个地方只考虑一个纹理的情况,其实最多可以有八个,可以再做个循环进行加载
		const aiVector3D\* pTexCoord = paiSubMesh->HasTextureCoords(0)
			? &(paiSubMesh->mTextureCoords[0][j])
			: &Zero3D;

		stMeshData.m_arTexCoords.Add(XMFLOAT2(pTexCoord->x, pTexCoord->y));
	}

	// 加载索引数据
	for (UINT j = 0; j < paiSubMesh->mNumFaces; j++)
	{
		const aiFace& Face = paiSubMesh->mFaces[j];
		// 已经通过导入标志强制为三角形网格了,每个面就三个索引
		ATLASSERT(Face.mNumIndices == GRS_INDICES_PER_FACE);

		for (UINT k = 0; k < Face.mNumIndices; k++)
		{
			stMeshData.m_arIndices.Add(Face.mIndices[k]);
		}
	}
}

stMeshData.m_arBoneIndices.SetCount(nNumVertices);

UINT		VertexID = 0;
FLOAT		Weight = 0.0f;
UINT		nBoneIndex = 0;
CStringA	strBoneName;
aiMatrix4x4 mxBoneOffset;
aiBone\*		pBone = nullptr;

// 加载骨骼数据
for (UINT i = 0; i < nMeshCnt; i++)
{
	paiSubMesh = stMeshData.m_paiModel->mMeshes[i];

	for (UINT j = 0; j < paiSubMesh->mNumBones; j++)
	{
		nBoneIndex = 0;
		pBone = paiSubMesh->mBones[j];
		strBoneName = pBone->mName.data;

		if ( nullptr == stMeshData.m_mapName2Bone.Lookup(strBoneName) )
		{
			// 新骨头索引
			nBoneIndex = nNumBones ++;
			stMeshData.m_arBoneDatas.SetCount(nNumBones);

			stMeshData.m_arBoneDatas[nBoneIndex].m_mxBoneOffset 
				= XMMatrixTranspose(MXEqual(stMeshData.m_arBoneDatas[nBoneIndex].m_mxBoneOffset, pBone->mOffsetMatrix));

			stMeshData.m_mapName2Bone.SetAt(strBoneName, nBoneIndex);
		}
		else
		{
			nBoneIndex = stMeshData.m_mapName2Bone[strBoneName];
		}

		for (UINT k = 0; k < pBone->mNumWeights; k++)
		{
			VertexID = stMeshData.m_arSubMeshInfo[i].m_nBaseVertex + pBone->mWeights[k].mVertexId;
			Weight = pBone->mWeights[k].mWeight;
			stMeshData.m_arBoneIndices[VertexID].AddBoneData(nBoneIndex, Weight);
		}
	}
}

/

你可能感兴趣的:(程序员,3d)