Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/lib/collision_detection/cd_engine.cc @ 5033

Last change on this file since 5033 was 5033, checked in by patrick, 19 years ago

orxonox/trunk: obb trees are now created for every object in the world. this will use some extra seconds in the startup and will also take some ms in the collision detection algorithm test. took 30fps here… will try to optimize it…

File size: 3.8 KB
Line 
1/*
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
11### File Specific:
12   main-programmer: Patrick Boenzli
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_COLLISION
17
18#include "cd_engine.h"
19#include "obb_tree.h"
20#include "debug.h"
21#include "list.h"
22
23#include "abstract_model.h"
24#include "world_entity.h"
25#include "terrain.h"
26#include "player.h"
27
28#include "spatial_separation.h"
29#include "quadtree.h"
30#include "quadtree_node.h"
31
32
33using namespace std;
34
35
36/**
37 *  standard constructor
38 */
39CDEngine::CDEngine ()
40{
41  this->setClassID(CL_CD_ENGINE, "CDEngine");
42}
43
44
45/**
46 *  the singleton reference to this class
47 */
48CDEngine* CDEngine::singletonRef = NULL;
49
50
51/**
52 *  standard deconstructor
53 */
54CDEngine::~CDEngine ()
55{
56  CDEngine::singletonRef = NULL;
57}
58
59
60/**
61 *  this is the collision checking function
62
63    there are some speed improvements that can be done here. a rewrite of the list a would be appropriate to
64    be able to enhance iteration speed.
65 */
66void CDEngine::checkCollisions()
67{
68  this->checkCollisionObjects();
69  this->checkCollisionGround();
70}
71
72
73/**
74 *  this checks the collisions with the objects
75 */
76void CDEngine::checkCollisionObjects()
77{
78  BVTree* tree;
79  tIterator<WorldEntity>* iterator1 = entityList->getIterator();
80  tIterator<WorldEntity>* iterator2 = entityList->getIterator();
81  WorldEntity* entity1 = iterator1->nextElement();
82  WorldEntity* entity2 = iterator2->seekElement(entity1);
83  PRINTF(3)("checking for collisions\n");
84  while( entity1 != NULL)
85  {
86    while( entity2 != NULL)
87    {
88      PRINTF(3)("checking object %s against %s\n", entity1->getName(), entity2->getName());
89      tree = entity1->getOBBTree();
90      if( likely(tree != NULL)) tree->collideWith(entity1, entity2);
91      entity2 = iterator2->nextElement();
92    }
93    entity1 = iterator1->nextElement();
94    entity2 = iterator2->seekElement(entity1);
95
96  }
97  delete iterator1;
98  delete iterator2;
99}
100
101
102/**
103 *  this checks the collisions with the ground
104 */
105void CDEngine::checkCollisionGround()
106{
107  if( likely( this->terrain != NULL))
108  {
109    Quadtree* q = this->terrain->ssp->getQuadtree();
110
111    QuadtreeNode* n = q->getQuadtreeFromPosition(this->player->getAbsCoor());
112  }
113  //sTriangleExt* tri = q->getTriangleFromPosition(this->player->getAbsCoor());
114}
115
116
117/**
118 *  this draws the bounding volume tree
119 * @param depth until which depth to draw the tree
120 * @param drawMode mod which states how to draw it
121 */
122void CDEngine::drawBV(int depth, int drawMode) const
123{
124  /* this would operate on  worldList bases, for testing purposes, we only use one OBBTree */
125  //this->rootTree->drawBV(depth, drawMode);
126
127  tIterator<WorldEntity>* iterator = entityList->getIterator();
128  WorldEntity* entity = iterator->nextElement();
129  while( entity != NULL)
130  {
131    entity->drawBVTree(depth, drawMode);
132    entity = iterator->nextElement();
133  }
134  delete iterator;
135}
136
137
138/**
139 * some debug output on the class
140 */
141void CDEngine::debug()
142{
143  PRINT(0)("\n=============================| CDEngine::debug() |===\n");
144  PRINT(0)("=  CDEngine: Spawning Tree Start\n");
145  //this->rootTree->debug();
146  PRINT(0)("=  CDEngine: Spawning Tree: Finished\n");
147  PRINT(0)("=======================================================\n");
148
149}
150
151
152/**
153 * this spawns a tree for debug purposes only
154 */
155void CDEngine::debugSpawnTree(int depth, sVec3D* vertices, int numVertices)
156{
157  if ( this->rootTree == NULL)
158    this->rootTree = new OBBTree();
159  this->rootTree->spawnBVTree(depth, vertices, numVertices);
160}
161
162
163/**
164 * this draws the debug spawn tree
165 */
166void CDEngine::debugDraw(int depth, int drawMode)
167{
168  if(this-> rootTree != NULL)
169    this->rootTree->drawBV(depth, drawMode);
170}
Note: See TracBrowser for help on using the repository browser.