⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcmesh.cpp

📁 国外网游源码....除工具源码缺少之外,其余程序都全...至于,什么游戏,因为国内还没有,所以找不到测试
💻 CPP
字号:
// MCMesh.cpp: implementation of the CMCMesh class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

char* strDamageName[] =
{
	_T("迫厕摹"),
	_T("窍冠"),
	_T("颊"),
	_T("公腑包例"),
	_T("辆酒府"),
	_T("缔厕摹"),
	_T("菊厕摹"),
	
};

CMCMesh::CMCMesh()
{
	m_pTexture = NULL;
	m_pVertexBuffer = NULL;
	m_pIndexBuffer = NULL;
	
	m_bRender = FALSE;

	m_nDamage = 0;
	m_nParts = 0;

	for(int i=0;i<MAX_BONEANI;i++)
	{
		m_vlAniMation[i].clear();
		m_pBoundBox[i] = NULL;
		m_nMaxFrame[i] = 0;
	}
	
	m_pD3DXMesh = NULL;

	D3DXMatrixIdentity(&m_matWorld);
}

CMCMesh::~CMCMesh()
{
	for(int i=0;i<MAX_BONEANI;i++)
	{
		m_vlAniMation[i].clear();
		SAFE_DELETE_ARRAY(m_pBoundBox[i]);
	}

	SAFE_DELETE_ARRAY(m_pMCVertex);
	SAFE_DELETE_ARRAY(m_nFace);
	SAFE_DELETE_ARRAY(m_nTexIndex);
	SAFE_DELETE_ARRAY(m_pTexture);

	SAFE_RELEASE(m_pVertexBuffer);
	SAFE_RELEASE(m_pIndexBuffer);
	SAFE_RELEASE(m_pD3DXMesh);
	
}

void CMCMesh::AddTexture( MCTEXTURE * pTexture, int nCount )
{
	if(!m_pTexture)
		m_pTexture = new MCTEXTURE*[m_nTexCount];
	m_pTexture[nCount] = pTexture;
}

void CMCMesh::AddAniMatrix( CMCAni * pAni, BYTE nIndex )
{
	m_vlAniMation[nIndex].push_back(pAni);
}

HRESULT CMCMesh::CreateVertexIndexBuffer()
{
	OutputDebugString("\n[角菩] CMCMesh::CreateVertexIndexBuffer 捞逞 捞惑茄逞捞促..");
	return E_FAIL;
}

HRESULT CMCMesh::CreateVertexIndexBufferEx()
{
	if(!m_bRender)
		return S_OK;
	
	if(m_pIndexBuffer)
		return S_OK;

	CMCAni * pAni = NULL;

	for( int i=0;i<MAX_BONEANI;i++)
	{
		if(m_vlAniMation[i].size() >0 )
		{
			pAni = m_vlAniMation[i][0];
		}
	}

	if(!pAni)
		return S_OK;

	OutputDebugString("[Start] CMCMeshEx CMD3Mesh::CreateIndexVertexBuffer\n");
	//------------------------------------------------------------------------------------------//
	// Index Buffer
	//------------------------------------------------------------------------------------------//
//	if(FAILED( g_pApp->GetD3dDevice()->CreateIndexBuffer( m_nFaceCount * sizeof(WORD)*3,		// 捞犯霸 镜瘤滴 葛福摆促..  青纺风 贸府 窍绰 规侥捞恭..
//												0,D3DFMT_INDEX16,
//												D3DPOOL_DEFAULT, &m_pIndexBuffer,NULL)))

	if(FAILED( g_pApp->GetD3dDevice()->CreateIndexBuffer( m_nFaceCount * sizeof(WORD)*3,
												D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,
												D3DPOOL_DEFAULT, &m_pIndexBuffer,NULL)))
	{
		OutputDebugString("[角菩] CMCMeshEx CMD3Mesh::CreateIndexBuffer\n");
		return E_FAIL;
	}
	
	WORD *pIndices=NULL;
	if( FAILED( m_pIndexBuffer->Lock(0,0, (void **)&pIndices, D3DLOCK_DISCARD) ))
	{
		return E_FAIL;
	}

	for( i=0; i<m_nFaceCount; i++)
	{
//		for(int j=0; j<3; j++)
//			pIndices[(i*3)+j] = (WORD)m_nFace[(i*3)+abs(j-2)];
		for(int j=0; j<3; j++)
			pIndices[(i*3)+j] = (WORD)m_nFace[(i*3)+abs(j)];
	}

	m_pIndexBuffer->Unlock();

//	if(FAILED( g_pApp->GetD3dDevice()->CreateVertexBuffer(m_nVertexCount * sizeof(MCFVFVERTEX),
//									0,
//									MC3FVF_VERTEX,D3DPOOL_DEFAULT, &m_pVertexBuffer, NULL) ))

	if(FAILED( g_pApp->GetD3dDevice()->CreateVertexBuffer(m_nVertexCount * sizeof(MCFVFVERTEX),
									D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY,
									MC3FVF_VERTEX,D3DPOOL_DEFAULT, &m_pVertexBuffer, NULL) ))
	{
		OutputDebugString("[角菩] CMCMeshEx CMD3Mesh::CreateVertexBuffer\n");
		return E_FAIL;
	}

	MCFVFVERTEX *pVertex=NULL;
	if( FAILED( m_pVertexBuffer->Lock(0,0, (void **)&pVertex, D3DLOCK_DISCARD) ))
		return E_FAIL;

	for( i=0; i<m_nVertexCount; i++)
	{
		D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
		//D3DXVec3TransformCoord(&vVector,&vVector,&m_matLocalTM);		// 捞逞篮 救持绢滴 搭芭 鞍促.. 青纺贸府 规侥俊绰 救付廉..
		pVertex[i].vVector = vVector;

		pVertex[i].vNoraml = m_pMCVertex[i].vNoraml;
		pVertex[i].Tex = m_pMCVertex[i].Tex;

	}
	
	if( FAILED( m_pVertexBuffer->Unlock() ) )
		return E_FAIL;

	D3DXVECTOR3 vMaxs;
	D3DXVECTOR3 vMins;

	for( i=0; i<m_nVertexCount; i++)
	{
		D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
		
		if( i==0 ){
			vMaxs.x = vVector.x;
			vMaxs.y = vVector.y;
			vMaxs.z = vVector.z;
			vMins.x = vVector.x;
			vMins.y = vVector.y;
			vMins.z = vVector.z;
		}else{
			if( vVector.x > vMaxs.x ) 
				vMaxs.x = vVector.x;
			if( vVector.y > vMaxs.y )
				vMaxs.y = vVector.y;
			if( vVector.z > vMaxs.z )
				vMaxs.z = vVector.z;
			if( vVector.x < vMins.x )
				vMins.x = vVector.x;
			if( vVector.y < vMins.y )
				vMins.y = vVector.y;
			if( vVector.z < vMins.z )
				vMins.z = vVector.z;
		}
	}
	// 官款爹 冠胶甫 D3DXMesh 滚傈(??)档 父甸绢敌促.
	SAFE_RELEASE(m_pD3DXMesh);
	D3DXVECTOR3 vSize = vMaxs - vMins;
	D3DXCreateBox(g_pApp->GetD3dDevice(),fabs(vSize.x),fabs(vSize.y),fabs(vSize.z),&m_pD3DXMesh,NULL);
	assert(m_pD3DXMesh);

	for( i=0; i<7; i++)
	{
		if(strstr(m_szName, strDamageName[i]))
		{
			m_nDamage = 3;
			return S_OK;
		}
		
	}
	
	if(!strcmp(m_szName, "赣府"))
		m_nDamage = 1;
	else
		m_nDamage = 2;
	
	return S_OK;
}

HRESULT CMCMesh::CreateBoundBox( BYTE nIndex )
{
	if(!m_bRender)
		return S_OK;
	
	// 官款爹 冠胶 父甸扁..
	SAFE_DELETE_ARRAY(m_pBoundBox[nIndex]);

	m_pBoundBox[nIndex] = new MD3BOUNDBOX[m_nMaxFrame[nIndex]];
	for(int nFrame=0; nFrame<m_nMaxFrame[nIndex]; nFrame++)
	{
		CMCAni * pAni = m_vlAniMation[nIndex][nFrame];
		for( int i=0; i<m_nVertexCount; i++)
		{
			D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
			D3DXVec3TransformCoord(&vVector,&vVector,&pAni->m_matWorldTM);

			if( i==0 ){
				m_pBoundBox[nIndex][nFrame].vMaxs.x = vVector.x;
				m_pBoundBox[nIndex][nFrame].vMaxs.y = vVector.y;
				m_pBoundBox[nIndex][nFrame].vMaxs.z = vVector.z;
				m_pBoundBox[nIndex][nFrame].vMins.x = vVector.x;
				m_pBoundBox[nIndex][nFrame].vMins.y = vVector.y;
				m_pBoundBox[nIndex][nFrame].vMins.z = vVector.z;
			}else{
				if( vVector.x > m_pBoundBox[nIndex][nFrame].vMaxs.x ) 
					m_pBoundBox[nIndex][nFrame].vMaxs.x = vVector.x;
				if( vVector.y > m_pBoundBox[nIndex][nFrame].vMaxs.y )
					m_pBoundBox[nIndex][nFrame].vMaxs.y = vVector.y;
				if( vVector.z > m_pBoundBox[nIndex][nFrame].vMaxs.z )
					m_pBoundBox[nIndex][nFrame].vMaxs.z = vVector.z;
				if( vVector.x < m_pBoundBox[nIndex][nFrame].vMins.x )
					m_pBoundBox[nIndex][nFrame].vMins.x = vVector.x;
				if( vVector.y < m_pBoundBox[nIndex][nFrame].vMins.y )
					m_pBoundBox[nIndex][nFrame].vMins.y = vVector.y;
				if( vVector.z < m_pBoundBox[nIndex][nFrame].vMins.z )
					m_pBoundBox[nIndex][nFrame].vMins.z = vVector.z;
			}
		}
		m_pBoundBox[nIndex][nFrame].Position = ((m_pBoundBox[nIndex][nFrame].vMaxs-m_pBoundBox[nIndex][nFrame].vMins)/(float)2.0)+
										m_pBoundBox[nIndex][nFrame].vMins;
		m_pBoundBox[nIndex][nFrame].scale = D3DXVec3Length(&(m_pBoundBox[nIndex][nFrame].Position-m_pBoundBox[nIndex][nFrame].vMins));
		memcpy(m_pBoundBox[nIndex][nFrame].name,m_szName,sizeof(m_pBoundBox[nIndex][nFrame].name));
	}
	return S_OK;
}

HRESULT CMCMesh::ReleaseVertexIndex()
{
	//SAFE_DELETE_ARRAY(m_pBoundBox);

	SAFE_RELEASE(m_pVertexBuffer);
	SAFE_RELEASE(m_pIndexBuffer);
	SAFE_RELEASE(m_pD3DXMesh);

	for(int i=0;i<MAX_BONEANI;i++)
		SAFE_DELETE_ARRAY(m_pBoundBox[i]);
	return S_OK;
}

HRESULT CMCMesh::UpdateAnimation(UINT nCurFrame, UINT nNextFrame, float fInterPolation, BYTE nIndex)
{
	if(!m_pVertexBuffer)
		return S_OK;
	
	MCFVFVERTEX *pVertex=NULL;
	if( FAILED( m_pVertexBuffer->Lock(0,0, (void **)&pVertex, D3DLOCK_DISCARD) ))
		return E_FAIL;

	// 谅钎 焊埃.. 局聪 青纺 焊埃..		焊埃过阑 青纺风父 窍绰 规过阑 舅酒 焊技..
	CMCAni * pCurrAni = m_vlAniMation[nIndex][nCurFrame];
	CMCAni * pNextAni = m_vlAniMation[nIndex][nNextFrame];
	
	if( pCurrAni == NULL || pNextAni == NULL )
	{	return E_FAIL;	}
	
	D3DXVECTOR3 vCurrVector;
	D3DXVECTOR3 vNextVector;
	for(int i=0; i<m_nVertexCount; i++)
	{	
		D3DXVECTOR3 vVector = m_pMCVertex[i].vVector;
		D3DXVec3TransformCoord(&vCurrVector,&vVector,&pCurrAni->m_matWorldTM);
		D3DXVec3TransformCoord(&vNextVector,&vVector,&pNextAni->m_matWorldTM);
		pVertex[i].vVector = vCurrVector + fInterPolation * (vNextVector-vCurrVector);
		//pVertex[i].vVector = vCurrVector;

	}

	if( FAILED( m_pVertexBuffer->Unlock() ) )
		return E_FAIL;
	return S_OK;
}

HRESULT CMCMesh::UpdateAnimationEx(UINT nCurFrame, UINT nNextFrame, float fInterPolation, BYTE nIndex)
{
	return S_OK;
}

HRESULT CMCMesh::Render(UINT nCurFrame, UINT nNextFrame, float fInterPolation, BYTE nIndex)
{
	if(!m_bRender)
		return S_OK;
	if(!m_pVertexBuffer)
		return S_OK;
	
	if(FAILED(UpdateAnimation( nCurFrame, nNextFrame, fInterPolation, nIndex )))
		return E_FAIL;
	
	for( int i=0; i<m_nTexCount; i++)
	{
		if(FAILED( g_pApp->GetD3dDevice()->SetTexture(i,m_pTexture[i]->pTexture) ))
		{
			OutputDebugString("[Failed] CMD3Mesh::Render / SetTexture \n");
			return E_FAIL;
		}
	}

	g_pApp->GetD3dDevice()->SetStreamSource(0,m_pVertexBuffer,0,sizeof(MCFVFVERTEX) );
	g_pApp->GetD3dDevice()->SetFVF(MC3FVF_VERTEX);
	g_pApp->GetD3dDevice()->SetIndices(m_pIndexBuffer);
	g_pApp->GetD3dDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0, m_nVertexCount,0,m_nFaceCount);
	return S_OK;
}

HRESULT CMCMesh::RenderEx(D3DXMATRIX matWorld, UINT nCurFrame, UINT nNextFrame, float fInterPolation, BYTE nIndex)
{
	if(!m_bRender)
		return S_OK;

	if(!m_pVertexBuffer)
		return S_OK;

	CMCAni * pCurrAni = m_vlAniMation[nIndex][nCurFrame];
	//CMCAni * pNextAni = pCurrAni;
	CMCAni * pNextAni = m_vlAniMation[nIndex][nNextFrame];
	
	// 局聪 青纺 焊埃..
	D3DXVECTOR3 vCurrVector;
	D3DXVECTOR3 vNextVector;

	D3DXQUATERNION quateCurFrame, quateNextFrame, quateResult;
	D3DXQuaternionRotationMatrix(&quateCurFrame, &pCurrAni->m_matWorldTM );
	D3DXQuaternionRotationMatrix(&quateNextFrame, &pNextAni->m_matWorldTM );
		
	D3DXQuaternionSlerp(&quateResult,&quateCurFrame, &quateNextFrame, fInterPolation );

	// 谅钎 焊埃..
	D3DXVECTOR3 vPosCurFrame, vPosNextFrame, vPosResult;

	vPosCurFrame = D3DXVECTOR3(pCurrAni->m_matWorldTM._41,pCurrAni->m_matWorldTM._42,pCurrAni->m_matWorldTM._43);
	vPosNextFrame = D3DXVECTOR3(pNextAni->m_matWorldTM._41,pNextAni->m_matWorldTM._42,pNextAni->m_matWorldTM._43);
	D3DXVec3Lerp(&vPosResult,&vPosCurFrame,&vPosNextFrame,fInterPolation);

	D3DXMATRIX matRotate;
	D3DXMatrixRotationQuaternion(&matRotate,&quateResult);	// 概飘腐胶肺
	D3DXMATRIX matTrans;
	D3DXMatrixTranslation(&matTrans, vPosResult.x, vPosResult.y, vPosResult.z);
	//D3DXMatrixTranslation(&matTrans, vPosResult);
//	D3DXMatrixRotationQuaternion(&matTrans,&m_quateResult);	// 概飘腐胶肺

	m_matWorld = matRotate * matTrans * matWorld;
	g_pApp->GetD3dDevice()->SetTransform(D3DTS_WORLD,&m_matWorld);

	for( int i=0; i<m_nTexCount; i++)
	{
		if(FAILED( g_pApp->GetD3dDevice()->SetTexture(i,m_pTexture[i]->pTexture) ))
		{
			OutputDebugString("[Failed] CMD3Mesh::Render / SetTexture \n");
			return E_FAIL;
		}
	}

	g_pApp->GetD3dDevice()->SetStreamSource(0,m_pVertexBuffer,0,sizeof(MCFVFVERTEX) );
	g_pApp->GetD3dDevice()->SetFVF(MC3FVF_VERTEX);
	g_pApp->GetD3dDevice()->SetIndices(m_pIndexBuffer);
	g_pApp->GetD3dDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0, m_nVertexCount,0,m_nFaceCount);

	return S_OK;
}


void CMCMesh::BoundingBoxRender(DWORD dwCurFrame, D3DXMATRIX& matWorld, BYTE nIndex )
{
	LPD3DXMESH pBoxMesh;
	MD3BOUNDBOX *pBox = &m_pBoundBox[nIndex][dwCurFrame];

	D3DVECTOR vSize = pBox->vMaxs - pBox->vMins;
	
	D3DXCreateBox(g_pApp->GetD3dDevice(),vSize.x,vSize.y,vSize.z,&pBoxMesh,NULL);

	DWORD Temp[3];
	g_pApp->GetD3dDevice()->GetRenderState(D3DRS_ZENABLE, &Temp[0]);
	g_pApp->GetD3dDevice()->GetRenderState(D3DRS_FILLMODE, &Temp[1]);
	g_pApp->GetD3dDevice()->GetRenderState(D3DRS_CULLMODE, &Temp[2]);
	
	g_pApp->GetD3dDevice()->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
	g_pApp->GetD3dDevice()->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
	g_pApp->GetD3dDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

	D3DXMATRIXA16 matResult;
	D3DVECTOR vLastPos;

	// 吝缴痢阑 备秦辑 vMin蔼 父怒 框流牢促.
	// D3DXCreateBox 窃荐绰 盔痢(0,0,0)阑 吝缴栏肺 冠胶甫 积己 窍扁 锭巩俊
	// 谅钎蔼捞 嘎瘤 臼扁 锭巩捞促.
	vLastPos.x = (vSize.x/2)+(pBox->vMins.x);
	vLastPos.y = (vSize.y/2)+(pBox->vMins.y);
	vLastPos.z = (vSize.z/2)+(pBox->vMins.z);

	D3DXMatrixTranslation(&matResult,vLastPos.x,vLastPos.y,vLastPos.z);

	// 葛胆狼 概飘腐胶客 利侩矫挪促.
	D3DXMatrixMultiply(&matResult, &matResult, &matWorld);

	g_pApp->GetD3dDevice()->SetTransform(D3DTS_WORLD,&matResult);
	
	pBoxMesh->DrawSubset(0);

	g_pApp->GetD3dDevice()->SetRenderState(D3DRS_ZENABLE, Temp[0]);
	g_pApp->GetD3dDevice()->SetRenderState(D3DRS_FILLMODE, Temp[1]);
	g_pApp->GetD3dDevice()->SetRenderState(D3DRS_CULLMODE, Temp[2]);

	SAFE_RELEASE(pBoxMesh);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -