Share Pastebin
Guest
Public paste!

LfBulletLargeTerrainModel

By: a guest | Jun 30th, 2010 | Syntax: C++ | Size: 5.04 KB | Hits: 50 | Expires: Never
This paste has a previous version, view the difference. Copy text to clipboard
  1. LfBulletLargeTerrainModel.h
  2. --------------------------------
  3. #ifndef _H_LFBULLETLARGETERRAIN_MODEL
  4. #define _H_LFBULLETLARGETERRAIN_MODEL
  5. #include "stdafx.h"
  6. #include "Utility.h"
  7.  
  8. #include <BulletCollision/CollisionShapes/btStridingMeshInterface.h>
  9. #include <BulletCollision/CollisionShapes/btTriangleBuffer.h>
  10. #include <BulletCollision/CollisionShapes/btTriangleMesh.h>
  11. #include <BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h>
  12. #include <BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h>
  13. #include <BulletCollision/CollisionShapes/btTriangleBuffer.h>
  14.  
  15. #include <lf/Lightfeather.h>
  16. using namespace lf;
  17.  
  18.  
  19. class LfBulletLargeTerrainModel : public res::CLargeTerrainModel, res::ITerrainTileLoadListener
  20. {
  21.  
  22.  
  23.   Utility tk;
  24.   btStridingMeshInterface* meshInterface;
  25.   btTriangleMesh* physicsTerrain;
  26.   btBvhTriangleMeshShape* terrainShape;
  27.   btTriangleIndexVertexArray* triArray;
  28.   core::vector2d<lf::u16> tile;
  29.   core::array<res::CMesh*> tileMeshes;
  30.   btVector3 minAabb;
  31.   btVector3 maxAabb;
  32.   core::aabbox3df bbox;
  33.   res::STriangleInfo triInfo;
  34.   lf::s32 index;
  35.   bool busy;
  36.  
  37. public:
  38.    LfBulletLargeTerrainModel(const core::stringc& name, const c8 *configFileName, scene::CCamera *observer, lf::u16 displayedTiles = 3, lf::f32 recalcDistanceSQ = 100.0f);
  39.  ~LfBulletLargeTerrainModel();
  40.  
  41.   inline btVector3 GetAabbMin() { return minAabb; }
  42.   inline btVector3 GetAabbMax() { return maxAabb; }
  43.   inline btBvhTriangleMeshShape* GetTerrainShape() { return terrainShape; }
  44.  
  45.   void tileLoaded(res::CTerrainTileEvent& event);
  46.   void tileUnloaded(res::CTerrainTileEvent& event);
  47.   void RemoveMeshTriangle( res::CMesh*, const  btTriangle& );
  48. };
  49. #endif
  50.  
  51. LfBulletLargeTerrainModel.cpp
  52. -------------------------------
  53. #include "stdafx.h"
  54. #include "LfBulletLargeTerrainModel.h"
  55.  
  56. #include <lf/Lightfeather.h>
  57. using namespace lf;
  58.  
  59. LfBulletLargeTerrainModel::LfBulletLargeTerrainModel(const core::stringc& name, const c8 *configFileName, scene::CCamera *observer, lf::u16 displayedTiles , lf::f32 recalcDistanceSQ )
  60. :  res::CLargeTerrainModel(name  ,configFileName, observer,displayedTiles, recalcDistanceSQ )
  61. {
  62.   tk = Utility();
  63.   busy = false;
  64.   addTileLoadListener(this);
  65.   meshInterface = physicsTerrain = new btTriangleMesh();
  66.   triArray = new btTriangleIndexVertexArray();
  67.   tileMeshes = core::array<res::CMesh*>();
  68.   tileMeshes.reallocate(2 * displayedTiles * displayedTiles);
  69.   tileMeshes.set_used(50);
  70.   terrainShape = NULL;
  71. }
  72.  
  73. LfBulletLargeTerrainModel::~LfBulletLargeTerrainModel() {   }
  74.  
  75.  
  76. void LfBulletLargeTerrainModel::tileLoaded(res::CTerrainTileEvent& e)
  77. {
  78.  
  79.     busy = true;
  80.     static int loops = 0;
  81.     int numDisplayed = this->getNumDisplayedTiles();
  82.     numDisplayed *= numDisplayed;
  83.  
  84.     if(loops  < numDisplayed + 1)
  85.      {
  86.        busy = false;
  87.        tileMeshes[loops] = e.getMesh();
  88.        loops++;
  89.        return; // store up the meshes
  90.      }
  91.     else
  92.     {
  93.  
  94.  
  95.      loops = 0;
  96.      btIndexedMesh iMesh = btIndexedMesh();
  97.      res::CVertexFormatDefinition* def = new res::CVertexFormatDefinition(e.getMesh()->getVertexBuffer()->getVertexFormatDefinition() );
  98.      res::CVertexBufferI* vertices = new res::CVertexBufferI("terrainVertices",e.getMesh()->getVertexBuffer()->getVertexCount(), def );
  99.      res::CIndexBuffer* indices;// = new res::CIndexBuffer();
  100.        while(loops < numDisplayed + 1)
  101.        {
  102.            
  103.            vertices->copyCommonElements( tileMeshes[loops]->getVertexBuffer() );
  104.            indices = tileMeshes[loops]->getIndexBuffer();
  105.  
  106.            iMesh.m_numVertices = vertices->getVertexCount();
  107.            iMesh.m_numTriangles = tileMeshes[loops]->getPolygonCount();
  108.            iMesh.m_triangleIndexBase = (const unsigned char*) indices->getPointer(true, true);
  109.            iMesh.m_triangleIndexStride = sizeof(res::EIDT_16BIT);
  110.            iMesh.m_vertexBase = (unsigned char*)vertices->getPointer(res::EVCT_POSITION, 0);
  111.            iMesh.m_vertexStride = 0;// vertices->getVertexStride();
  112.            triArray->addIndexedMesh(iMesh);
  113.  
  114.            loops++;
  115.         } // end while
  116.        } // end if
  117.      
  118.  
  119.       if(terrainShape == NULL) // first run
  120.       {
  121.            
  122.            //btTriangleBuffer triBuf = btTriangleBuffer();
  123.            meshInterface = triArray;
  124.            terrainShape = new btBvhTriangleMeshShape(meshInterface, true, minAabb, maxAabb, false);
  125.          
  126.            //terrainShape->processAllTriangles(&triBuf, btVector3(0, 0, 0), btVector3(1024, 1024, 1024) );
  127.        
  128.       }    
  129.  
  130.  
  131. }
  132.  
  133. void LfBulletLargeTerrainModel::tileUnloaded(res::CTerrainTileEvent& event)
  134. {
  135.   res::CMesh* tileMesh = event.getMesh();
  136.  
  137.   btTriangleBuffer triBuf;
  138.   terrainShape->processAllTriangles(&triBuf,minAabb, maxAabb);
  139.   for (int i=0;i<triBuf.getNumTriangles();i++)
  140.   {
  141.     const btTriangle&  tri = triBuf.getTriangle(i);
  142.     RemoveMeshTriangle(tileMesh, tri);
  143.  
  144.  
  145.  
  146.   }
  147. }
  148.  
  149. void LfBulletLargeTerrainModel::RemoveMeshTriangle(res::CMesh* mesh, const btTriangle& theTriangle)
  150. {
  151.  
  152.   printf("Tile Unloaded");
  153.  
  154.  
  155. }
  156.  
  157. * A number of variables are there just in case.