4D星宇

c++

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  57 随笔 :: 0 文章 :: 39 评论 :: 0 Trackbacks
//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);
posted on 2008-05-04 12:20 bloodbao 阅读(243) 评论(0)  编辑 收藏 引用 所属分类: c++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理