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

📄 colmesh.cpp

📁 Beginning Direct3D Game Programming源代码Part3chapter12
💻 CPP
字号:
#include "colmesh.h"

struct Vertex
{
  float x,y,z;
  //float nx,ny,nz;
  //float tu,tv;
};


HRESULT CCollidableMesh::Create( LPDIRECT3DDEVICE8 pd3dDevice, TCHAR* strFilename )
{
  HRESULT rc=CD3DMesh::Create(pd3dDevice,strFilename);
  if (SUCCEEDED(rc))
  {
    m_ColModel=newCollisionModel3D();
    LPD3DXMESH clone;
    if (SUCCEEDED(m_pSysMemMesh->CloneMeshFVF(D3DXMESH_SYSTEMMEM,D3DFVF_XYZ,pd3dDevice,&clone)))
    {
      int vnum=clone->GetNumVertices();
      int fnum=clone->GetNumFaces();
      Vertex* v;
      if (SUCCEEDED(clone->LockVertexBuffer(D3DLOCK_READONLY,(BYTE**)&v)))
      {
        WORD* ind;
        if (SUCCEEDED(clone->LockIndexBuffer(D3DLOCK_READONLY,(BYTE**)&ind)))
        {
          for(int i=0;i<fnum;i++)
          {
            m_ColModel->addTriangle((float*)&v[ind[i*3+0]],
                                    (float*)&v[ind[i*3+1]],
                                    (float*)&v[ind[i*3+2]]);
          }
          m_ColModel->finalize();
          clone->UnlockIndexBuffer();
        }
        clone->UnlockVertexBuffer();
      }
      clone->Release();
    }
  }
  return rc;
}

void CCollidableMesh::SetPosition(const Vector3D& v)
{
  Vector3D& pos=*((Vector3D*)&m_Transform(3,0));
  pos=v;
}

void CCollidableMesh::SetDirection(const Vector3D& v)
{
  float speed=m_Speed.Magnitude();
  m_Speed=speed*v;
}

HRESULT CCollidableMesh::Render(LPDIRECT3DDEVICE8 pd3dDevice, 
                                BOOL bDrawOpaqueSubsets,
                                BOOL bDrawAlphaSubsets)
{
  pd3dDevice->SetTransform( D3DTS_WORLD,  (D3DMATRIX*)&m_Transform );
  return CD3DMesh::Render(pd3dDevice,bDrawOpaqueSubsets,bDrawAlphaSubsets);
}

bool    CCollidableMesh::Collision(CCollidableMesh& other)
{
  return m_ColModel->collision(other.m_ColModel);
}

HRESULT CCollidableMesh::Advance(float dt)
{
  Matrix3D m=PitchMatrix3D(0);
  m.rotate(dt*m_RotateSpeed);
  m_Transform=m*m_Transform;
  m_ColModel->setTransform((float*)&m_Transform);
  Vector3D& pos=*((Vector3D*)&m_Transform(3,0));
  pos+=dt*m_Speed;
  return D3D_OK;
}

void    CCollidableMesh::React(CCollidableMesh& other)
{
  Vector3D t1[3],t2[3];
  Vector3D p;
  m_ColModel->getCollisionPoint((float*)&p,false);
  Vector3D dir1=Vector3D(m_Transform(3,0),m_Transform(3,1),m_Transform(3,2)) - p;
  Vector3D dir2=Vector3D(other.m_Transform(3,0),
                         other.m_Transform(3,1),
                         other.m_Transform(3,2)) - p;
  dir1 /= dir1.Magnitude();
  dir2 /= dir2.Magnitude();

  float momentum1 = m_Speed.Magnitude() * m_Mass;
  float momentum2 = other.m_Speed.Magnitude() * other.m_Mass;

  SetSpeed((momentum2/m_Mass)*dir1);
  other.SetSpeed((momentum1/other.m_Mass)*dir2);
}

⌨️ 快捷键说明

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