www.pudn.com > 3DRPG.rar > npc.cpp
#include "stdafx.h"
#include "npc.h"
CNpc::CNpc(LPDIRECT3DDEVICE9 d3dd,LPSTR str)
{
//pos=poss;
m_pD3DDevice=d3dd;
LPD3DXBUFFER pBuffer;
D3DXMATERIAL * pMat;
//LPD3DXNpc pNpc = NULL;
D3DXLoadMeshFromX(str,D3DXMESH_SYSTEMMEM,m_pD3DDevice,NULL,&pBuffer,NULL,&m_dwNumOfMaterials,&m_pNpc);
pMat=(D3DXMATERIAL*) pBuffer->GetBufferPointer();
m_pMaterial=new D3DMATERIAL9 [m_dwNumOfMaterials];
m_pTexture=new LPDIRECT3DTEXTURE9 [m_dwNumOfMaterials];
for(DWORD i=0;iRelease();
//pNpc->CloneNpcFVF(D3DXNpc_MANAGED, MESH_D3DFVF_CUSTOMVERTEX, m_pD3DDevice, &m_pMesh);
//SafeRelease(pMesh);
DWORD * adjacencyInfo=new DWORD[m_pNpc->GetNumFaces()*3];
m_pNpc->GenerateAdjacency(0.0f,adjacencyInfo);
DWORD* optimizedAdjacencyInfo=new DWORD[m_pNpc->GetNumFaces()*3];
m_pNpc->OptimizeInplace(D3DXMESHOPT_ATTRSORT|D3DXMESHOPT_COMPACT|D3DXMESHOPT_VERTEXCACHE,adjacencyInfo,optimizedAdjacencyInfo,0,0);
D3DXComputeNormals(m_pNpc,NULL);
}
CNpc::~CNpc()
{
if(m_pMaterial!=NULL)
{
delete [] m_pMaterial;
}
if(m_pTexture!=NULL)
{
for(DWORD i=0;iRelease();
}
}
delete [] m_pTexture;
}
m_pNpc->Release();
}
void CNpc::RenderNpc()
{
for(DWORD i=0;iSetMaterial(&m_pMaterial[i]);
m_pD3DDevice->SetTexture(0,m_pTexture[i]);
m_pNpc->DrawSubset(i);
}
}
void CNpc::Translate()
{
D3DXMATRIX matWorld,matRotation;
D3DXMatrixTranslation(&matRotation,pos.x,pos.y,pos.z);
m_pD3DDevice->SetTransform(D3DTS_WORLD,&matRotation);
}
void CNpc::Translation(float x,float y,float z,float a,float k)
{
float aa=D3DX_PI/180*a;
D3DXMATRIX matRotate,matTrans ,matScal;
D3DXMatrixTranslation(&matTrans,x,y,z);
D3DXMatrixRotationY(&matRotate,aa);
D3DXMatrixScaling(&matScal,k,k,k);
D3DXMatrixMultiply(&matWorld,&matRotate,&matScal);
D3DXMatrixMultiply(&matWorld,&matWorld,&matTrans);
m_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
}