-
Notifications
You must be signed in to change notification settings - Fork 1
/
PhysicsObject.cpp
116 lines (90 loc) · 3.57 KB
/
PhysicsObject.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
#include "PhysicsObject.h"
#include <iostream>
PhysicsObject::PhysicsObject(void) :
collisionShape(NULL),
rigidBody(NULL),
isRigid(true)
{
}
PhysicsObject::~PhysicsObject(void)
{
clearData();
std::cout << "========= Debug: Physics Object Deleted =========" << std::endl;
}
void PhysicsObject::clearData(void) {
if(rigidBody)
delete rigidBody->getMotionState();
delete rigidBody;
delete collisionShape;
}
void PhysicsObject::setToBox(const btVector3 &boxHalfExtents, btScalar mass, const btQuaternion &orientation, const btVector3 &pos) {
clearData();
collisionShape = new btBoxShape(boxHalfExtents);
btVector3 inertia(0,0,0);
collisionShape->calculateLocalInertia(mass, inertia);
btDefaultMotionState* motionState =
new btDefaultMotionState(btTransform(orientation,pos));
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass,motionState,collisionShape,inertia);
rigidBody = new btRigidBody(rigidBodyCI);
}
void PhysicsObject::setToStaticPlane(const btVector3 &normal, btScalar distAlongNormal) {
clearData();
collisionShape = new btStaticPlaneShape(normal, distAlongNormal);
btDefaultMotionState* motionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1)));
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(0,motionState,collisionShape,btVector3(0,0,0));
rigidBody = new btRigidBody(rigidBodyCI);
}
void PhysicsObject::setToSphere(btScalar radius, btScalar mass, const btQuaternion &orientation, const btVector3 &pos) {
clearData();
collisionShape = new btSphereShape(radius);
btVector3 inertia(0,0,0);
collisionShape->calculateLocalInertia(mass, inertia);
btDefaultMotionState* motionState =
new btDefaultMotionState(btTransform(orientation,pos));
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(mass,motionState,collisionShape,inertia);
rigidBody = new btRigidBody(rigidBodyCI);
rigidBody->setActivationState(DISABLE_DEACTIVATION);
}
void PhysicsObject::toggleRigidBodyAndKinematic(btScalar mass) {
if (isRigid) {
rigidBody->setMassProps(0, btVector3(0,0,0));
rigidBody->setCollisionFlags(rigidBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
rigidBody->setLinearVelocity(btVector3(0,0,0));
rigidBody->setAngularVelocity(btVector3(0,0,0));
rigidBody->setActivationState(DISABLE_DEACTIVATION);
} else {
btVector3 inertia(0,0,0);
rigidBody->getCollisionShape()->calculateLocalInertia(mass, inertia);
rigidBody->setCollisionFlags(btCollisionObject::CF_STATIC_OBJECT);
rigidBody->setMassProps(mass, inertia);
rigidBody->updateInertiaTensor();
rigidBody->setLinearVelocity(btVector3(0,0,0));
rigidBody->setAngularVelocity(btVector3(0,0,0));
//rigidBody->setActivationState(WANTS_DEACTIVATION);
}
isRigid = !isRigid;
}
btVector3 PhysicsObject::getCenterOfMassPosition() {
rigidBody->getCenterOfMassPosition();
}
void PhysicsObject::getWorldTransform(btTransform& trans) {
rigidBody->getMotionState()->getWorldTransform(trans);
}
void PhysicsObject::setWorldTransform(const btTransform& newTrans) {
rigidBody->getMotionState()->setWorldTransform(newTrans);
}
void PhysicsObject::applyCentralForce(const btVector3& force) {
rigidBody->applyCentralForce(force);
}
void PhysicsObject::setRestitution(btScalar factor) {
rigidBody->setRestitution(factor);
}
void PhysicsObject::setFriction(btScalar factor) {
rigidBody->setFriction(factor);
}
void PhysicsObject::setLinearVelocity(const btVector3& v) {
rigidBody->setLinearVelocity(v);
}
void PhysicsObject::setAngularVelocity(const btVector3& v) {
rigidBody->setAngularVelocity(v);
}