Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/terrain/src/lib/collision_detection/cd_engine.cc @ 8741

Last change on this file since 8741 was 8741, checked in by ponder, 18 years ago
  • Finally, I got the terrain working completly. What a hard work… It took me lots and lots of hours to remove all bugs in the tesselation routines.
File size: 4.3 KB
RevLine 
[4615]1/*
[4510]2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
[4923]11### File Specific:
[4511]12   main-programmer: Patrick Boenzli
[4510]13   co-programmer: ...
14*/
15
[7711]16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_COLLISION_DETECTION
[4510]17
[4511]18#include "cd_engine.h"
[4546]19#include "obb_tree.h"
20#include "debug.h"
[4510]21
[8490]22#include "class_list.h"
23
[6022]24#include "model.h"
[4919]25#include "world_entity.h"
[8715]26#include "terrain_entity.h"
[5915]27// #include "player.h"
[4919]28
29#include "spatial_separation.h"
30#include "quadtree.h"
31#include "quadtree_node.h"
32
[8186]33#include "bsp_manager.h"
[8490]34#include "bsp_entity.h"
[4919]35
[4510]36using namespace std;
37
38
39/**
[4836]40 *  standard constructor
[4923]41 */
[4615]42CDEngine::CDEngine ()
[4510]43{
[4923]44  this->setClassID(CL_CD_ENGINE, "CDEngine");
[7711]45
46  this->bAbordOnFirstCollision = false;
[4510]47}
48
[4923]49
[4510]50/**
[4836]51 *  the singleton reference to this class
[4923]52 */
[4511]53CDEngine* CDEngine::singletonRef = NULL;
[4510]54
[4923]55
[4510]56/**
[4836]57 *  standard deconstructor
[4923]58 */
[4615]59CDEngine::~CDEngine ()
[4510]60{
[4511]61  CDEngine::singletonRef = NULL;
[4510]62}
[4546]63
64
[4695]65/**
[7711]66 *
[4695]67 */
[7370]68void CDEngine::checkCollisions(ObjectManager::EntityList& list1, ObjectManager::EntityList& list2)
[4904]69{
[5027]70  BVTree* tree;
[7370]71  ObjectManager::EntityList::iterator entity1, entity2, pre1, pre2;
[7711]72  PRINTF(5)("checking for collisions\n");
[6142]73
74  pre1 = list1.begin();
75  while (pre1 != list1.end())
[4689]76  {
[6142]77    entity1 = pre1++;
78    if( likely((*entity1) != this->terrain))
[4689]79    {
[6142]80      pre2 = list2.begin();
81      while (pre2 != list2.end())
[5038]82      {
[6142]83        entity2 = pre2++;
84        if( likely((*entity2) != this->terrain))
[5038]85        {
[6142]86          PRINTF(4)("checking object %s against %s\n", (*entity1)->getName(), (*entity2)->getName());
87          tree = (*entity1)->getOBBTree();
[7711]88          if( likely(tree != NULL) && (*entity2)->getOBBTree() != NULL)
89            tree->collideWith(*entity1, *entity2);
[5131]90        }
[5038]91      }
[4689]92    }
[5111]93  }
[4675]94}
95
96
[4924]97/**
98 *  this checks the collisions with the ground
99 */
[8186]100void CDEngine::checkCollisionGround(std::list<WorldEntity*>& list1)
[4904]101{
[8316]102
[8490]103  std::list<BaseObject*>::const_iterator bspIterator;
104  std::list<WorldEntity*>::iterator entityIterator;
105  const std::list<BaseObject*>* bspList = ClassList::getList(CL_BSP_ENTITY);
[8715]106  if( bspList != NULL) {
[8186]107
[8715]108        // for all bsp managers check all entities
109        for( bspIterator = bspList->begin(); bspIterator != bspList->end(); bspIterator++) {
110        for(entityIterator = list1.begin(); entityIterator != list1.end(); entityIterator++)
111        {
112//               PRINTF(0)("Checking: %s a %s\n", (*entityIterator)->getName(), (*entityIterator)->getClassName());
113                (dynamic_cast<BspEntity*>(*bspIterator)->getBspManager())->checkCollision(*entityIterator);
114        }
115        }
116        }
117        const std::list<BaseObject*>* tl = ClassList::getList( CL_TERRAIN );
118  std::list<BaseObject*>::const_iterator ti;   
119        if ( tl == NULL )
120                return;
[8741]121        float offset = 8.0f;
[8715]122        for ( ti = tl->begin(); ti != tl->end(); ++ti ) {
123                        TerrainEntity* terrain = dynamic_cast<TerrainEntity*>( *ti );
124      for( entityIterator = list1.begin(); entityIterator != list1.end(); entityIterator++ )
125                {
[8741]126                                Vector pos( (*entityIterator)->getAbsCoor() );
127                                Vector normal;
128                                float height = pos.y;
129                                terrain->getAltitude( pos, normal );
130                                if ( height-offset < pos.y ) {
131                                        ( *entityIterator )->registerCollision( 
132                                                *entityIterator, terrain, pos, normal );
[8715]133                                }
[8490]134      }
[8715]135        }
[4904]136}
[4688]137
138
[4924]139/**
140 * some debug output on the class
141 */
[4546]142void CDEngine::debug()
143{
144  PRINT(0)("\n=============================| CDEngine::debug() |===\n");
145  PRINT(0)("=  CDEngine: Spawning Tree Start\n");
[4689]146  //this->rootTree->debug();
[4546]147  PRINT(0)("=  CDEngine: Spawning Tree: Finished\n");
[4615]148  PRINT(0)("=======================================================\n");
[4546]149}
[4615]150
[4924]151
152/**
153 * this spawns a tree for debug purposes only
154 */
[4615]155void CDEngine::debugSpawnTree(int depth, sVec3D* vertices, int numVertices)
156{
[7711]157//   if ( this->rootTree == NULL)
158//     this->rootTree = new OBBTree(depth, vertices, numVertices);
[4615]159}
[4710]160
[4924]161
[7739]162void CDEngine::drawBV(const ObjectManager::EntityList& drawList, int level) const
[6316]163{
[7370]164  ObjectManager::EntityList::const_iterator entity;
[6316]165  for (entity = drawList.begin(); entity != drawList.end(); entity++)
[7739]166    (*entity)->drawBVTree(level, 226);
[6316]167}
168
[8490]169
[4924]170/**
171 * this draws the debug spawn tree
172 */
[4710]173void CDEngine::debugDraw(int depth, int drawMode)
174{
[7711]175//   if(this-> rootTree != NULL)
176//     this->rootTree->drawBV(depth, drawMode);
[4710]177}
Note: See TracBrowser for help on using the repository browser.