newton冲突---FOR IRRLICHT

newton冲突---FOR IRRLICHT
// Function   to  create a NewtonCollision from irrlicht mesh 
NewtonCollision 
* CreateCollisionFromMesh(NewtonWorld  * nWorld, scene::IMesh  * mesh) 

  
// Get  number of vertices 
  u32 nVertices 
=   0 , nMeshBuffer; 
  
for ( nMeshBuffer  =   0  ; nMeshBuffer  <  mesh -> getMeshBufferCount();  ++ nMeshBuffer) 
  { 
    scene::IMeshBuffer 
* buffer  =  mesh -> getMeshBuffer(nMeshBuffer); 
    nVertices 
+=  buffer -> getVertexCount(); 
  } 

  
//  allocate block  for  positions of every vertex in mesh, no need  to  delete 
  
//  anything, the  array  cleans up  for  us. 
  core::
array < core::vector3df >  vertices; 
  vertices.reallocate(nVertices); 

  
// Get  mesh buffers  and  copy face vertices 
  
for ( nMeshBuffer  =   0  ; nMeshBuffer  <  mesh -> getMeshBufferCount();  ++ nMeshBuffer) 
  { 
    scene::IMeshBuffer 
* buffer  =  mesh -> getMeshBuffer(nMeshBuffer); 

    
//  handle the irrlicht supported vertex types 
    switch(buffer
-> getVertexType()) 
    { 
    
case  video::EVT_STANDARD: 
      { 
        video::S3DVertex
*  verts  =  (video::S3DVertex * )buffer -> getVertices(); 
        
for (u32 v  =   0 ; v  <  buffer -> getVertexCount();  ++ v) 
          vertices.push_back(verts[v].Pos); 
      } 
      break; 

    
case  video::EVT_2TCOORDS: 
      { 
        video::S3DVertex2TCoords
*  verts  =  (video::S3DVertex2TCoords * )buffer -> getVertices(); 
        
for (u32 v  =   0 ; v  <  buffer -> getVertexCount();  ++ v) 
          vertices.push_back(verts[v].Pos); 
      } 
      break; 

    
case  video::EVT_TANGENTS: 
      { 
        video::S3DVertexTangents
*  verts  =  (video::S3DVertexTangents * )buffer -> getVertices(); 
        
for (u32 v  =   0 ; v  <  buffer -> getVertexCount();  ++ v) 
          vertices.push_back(verts[v].Pos); 
      } 
      break; 

    default: 
      return 
0 //  don ' t know vertex type! bail. 
    } 
  } 

  
// Create Newton collision  object  
  return NewtonCreateConvexHull(nWorld, nVertices, 
& vertices[ 0 ].X, sizeof(core::vector3df),  NULL ); 
}

core::
array < f32 >  vertices; 
vertices.reallocate(nVertices 
*   3 ); 

//   each   loop  should be updated 
for (u32 v  =   0 ; v  <  buffer -> getVertexCount();  ++ v) 

  vertices.push_back(verts[v].Pos.X); 
  vertices.push_back(verts[v].Pos.Y); 
  vertices.push_back(verts[v].Pos.Z); 


//  this should be passed  to  the convex hull  function  
return NewtonCreateConvexHull(nWorld, nVertices, 
& vertices[ 0 ], sizeof(f32  *   3 ),  NULL );

你可能感兴趣的:(newton冲突---FOR IRRLICHT)