forked from chenzhi/CameraGame
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CollisionManager.cpp
124 lines (90 loc) · 2.95 KB
/
CollisionManager.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// CollisionManager.cpp
// ogreApp
//
// Created by thcz on 11-6-24.
// Copyright 2011Äê __MyCompanyName__. All rights reserved.
//
#include "pch.h"
#include "CollisionManager.h"
#define MAX_PROXIES 8192
template<> CollisionManager* Ogre::Singleton<CollisionManager>::ms_Singleton=NULL;
CollisionManager::CollisionManager()
:m_pDynamicsWorld(NULL),m_pCollisionConfig(NULL),m_pCollisionDispatcher(NULL),m_pConstraintSolver(NULL),m_pBroadphase(NULL)
{
init();
}
CollisionManager::~CollisionManager()
{
destroy();
}
//-----------------------------------
void CollisionManager::init()
{
m_pCollisionConfig = new btDefaultCollisionConfiguration();
///the maximum size of the collision world. Make sure objects stay within these boundaries
///Don't make the world AABB size too large, it will harm simulation quality and performance
btVector3 worldAabbMin(-10000,-10000,-10000);
btVector3 worldAabbMax(10000,10000,10000);
m_pBroadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,MAX_PROXIES);
m_pCollisionDispatcher = new btCollisionDispatcher(m_pCollisionConfig);
m_pConstraintSolver = new btSequentialImpulseConstraintSolver;
m_pDynamicsWorld = new btDiscreteDynamicsWorld(m_pCollisionDispatcher,m_pBroadphase,m_pConstraintSolver,m_pCollisionConfig);
m_pDynamicsWorld->setGravity(btVector3(0,0,0));
}
///ÉèÖÃÖØÁ¦
void CollisionManager::setGravity(float x,float y, float z)
{
m_pDynamicsWorld->setGravity(btVector3(x,y,z));
return ;
}
//-----------------------------------
btRigidBody* CollisionManager::createRigidBody(float radius,float mass,Ogre::SceneNode* pNode)
{
return NULL;
}
//-----------------------------------
void CollisionManager::update(float time)
{
if (m_pDynamicsWorld)
{
m_pDynamicsWorld->stepSimulation(time,4);
}
return ;
}
//------------------------------------------
void CollisionManager::destroy()
{
//remove the rigidbodies from the dynamics world and delete them
for (int i=m_pDynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--)
{
btCollisionObject* obj = m_pDynamicsWorld->getCollisionObjectArray()[i];
btRigidBody* body = btRigidBody::upcast(obj);
if (body && body->getMotionState())
{
delete body->getMotionState();
}
m_pDynamicsWorld->removeCollisionObject( obj );
delete obj;
}
//delete collision shapes
for (int j=0;j<m_CollisionShapes.size();j++)
{
btCollisionShape* shape = m_CollisionShapes[j];
m_CollisionShapes[j] = 0;
delete shape;
}
m_CollisionShapes.clear();
///cleanup Bullet stuff
delete m_pDynamicsWorld;
m_pDynamicsWorld =NULL;
delete m_pConstraintSolver;
m_pConstraintSolver=NULL;;
delete m_pCollisionDispatcher;
m_pCollisionDispatcher=NULL;;
delete m_pBroadphase;
m_pBroadphase=NULL;;
delete m_pCollisionConfig;
m_pCollisionConfig=NULL;
return ;
}