for each face....
FaceEx *pFaceEx = pGameMesh->GetFace(faceId);
// 得到位置
int vertexId = pFaceEx->vert[faceVertexId];
Point3 vertex;
if( pGameMesh->GetVertex(vertexId, vertex) )
pVertexData->m_position = vertex;
// 得到法向量
int normId = pFaceEx->norm[faceVertexId];
Point3 normal;
if( pGameMesh->GetNormal(normId, normal) )
pVertexData->m_normal = normal;
// 得到纹理坐标
// mapchannel代表一层纹理坐标, 如果mapchannel个数为1,则直接使用GetTexVertex()函数
// 否则就遍历所有的TextureMap,计算本TextureMap的纹理坐标
if( pGameMesh->GetActiveMapChannelNum().Count() == 1 )
{
int texCoordId = pFaceEx->texCoord[faceVertexId];
Point2 texCoord;
if( pGameMesh->GetTexVertex(texCoordId, texCoord) )
pVertexData->AddTextureCoordinate( texCoord.x, 1.f - texCoord.y );
}
else
{
IGameMaterial *pGameMaterial = pGameMesh->GetMaterialFromFace( pFaceEx );
int iNumTexture = pGameMaterial->GetNumberOfTextureMaps();
for( int i = 0; i < iNumTexture; ++i )
{
IGameTextureMap *pTexture = pGameMaterial->GetIGameTextureMap(i);
TCHAR *tcName = pTexture->GetBitmapFileName();
int iChannel = pTexture->GetMaxTexmap()->GetMapChannel();
DWORD vertexId[3];
Point3 uvVert;
if( pGameMesh->GetMapFaceIndex(iChannel, faceId, vertexId) )
{
if( pGameMesh->GetMapVertex(iChannel, vertexId[faceVertexId], uvVert) )
{
IGameUVGen *pGameUVGen = pTexture->GetIGameUVGen();
GMatrix gmUV = pGameUVGen->GetUVTransform();
uvVert = uvVert * gmUV;
pVertexData->AddTextureCoordinate( uvVert.x, 1.f - uvVert.y );
}
}
}
}
// 得到skin信息
if( pGameMesh->IsObjectSkinned() )
{
IGameSkin *pGameSkin = NULL;
pGameSkin = pGameMesh->GetIGameSkin();
int iBoneID;
float fWeight;
int type = pGameSkin->GetVertexType(vertexId);
if(type==IGameSkin::IGAME_RIGID)
{
iBoneID = pGameSkin->GetBoneID(vertexId,0);
IGameNode *pBoneNode = g_Exporter.GetIGameScene()->GetIGameNode(ULONG(iBoneID));
TCHAR *chBoneName = pBoneNode->GetName();
fWeight = 1.f;
pVertexData->AddInfluence(iBoneID, fWeight);
}
else //blended
{
for(int b=0;b<pGameSkin->GetNumberOfBones(vertexId);++b)
{
iBoneID = pGameSkin->GetBoneID(vertexId,b);
IGameNode *pBoneNode = g_Exporter.GetIGameScene()->GetIGameNode(ULONG(iBoneID));
TCHAR *chBoneName = pBoneNode->GetName();
fWeight = pGameSkin->GetWeight(vertexId,b);
pVertexData->AddInfluence(iBoneID, fWeight);
}
}
}