Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/WolfireGames/overgrowth.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Physics/bulletobject.cpp')
-rw-r--r--Source/Physics/bulletobject.cpp257
1 files changed, 121 insertions, 136 deletions
diff --git a/Source/Physics/bulletobject.cpp b/Source/Physics/bulletobject.cpp
index 6d1c163c..44893773 100644
--- a/Source/Physics/bulletobject.cpp
+++ b/Source/Physics/bulletobject.cpp
@@ -40,12 +40,12 @@
extern Timer game_timer;
-mat4 SafeGetOpenGLMatrix(const btTransform& bt_transform) {
+mat4 SafeGetOpenGLMatrix(const btTransform &bt_transform) {
// Make sure that transform mat4 is 16-byte aligned
// since Bullet may be reading to it from SSE intrinsics
- char aligned_mem[sizeof(mat4)+16];
- uintptr_t first = ((uintptr_t)aligned_mem)%16;
- mat4* mat = (mat4*)&aligned_mem[16-first];
+ char aligned_mem[sizeof(mat4) + 16];
+ uintptr_t first = ((uintptr_t)aligned_mem) % 16;
+ mat4 *mat = (mat4 *)&aligned_mem[16 - first];
bt_transform.getOpenGLMatrix(mat->entries);
return *mat;
}
@@ -70,7 +70,7 @@ void ValidateTransform(const btTransform &bt_transform) {
}*/
}
-void BulletObject::SetPosition( const vec3 &position) {
+void BulletObject::SetPosition(const vec3 &position) {
btTransform bt_transform = body->getWorldTransform();
vec3 new_pos = position + GetRotation() * com_offset;
bt_transform.setOrigin(btVector3(new_pos[0],
@@ -80,15 +80,15 @@ void BulletObject::SetPosition( const vec3 &position) {
body->setWorldTransform(bt_transform);
}
-void BulletObject::SetMargin( float _margin ) {
+void BulletObject::SetMargin(float _margin) {
shape->setMargin(_margin);
}
-float BulletObject::GetMargin( ) {
+float BulletObject::GetMargin() {
return shape->getMargin();
}
-void BulletObject::SetRotation( const mat4 &rotation) {
+void BulletObject::SetRotation(const mat4 &rotation) {
btVector3 old_origin = body->getWorldTransform().getOrigin();
btTransform new_transform;
new_transform.setFromOpenGLMatrix(rotation.entries);
@@ -97,23 +97,23 @@ void BulletObject::SetRotation( const mat4 &rotation) {
body->setWorldTransform(new_transform);
}
-void BulletObject::SetRotation( const quaternion &rotation) {
+void BulletObject::SetRotation(const quaternion &rotation) {
btVector3 old_origin = body->getWorldTransform().getOrigin();
btTransform new_transform;
- new_transform.setRotation(btQuaternion(rotation.entries[0],rotation.entries[1],rotation.entries[2],rotation.entries[3]));
+ new_transform.setRotation(btQuaternion(rotation.entries[0], rotation.entries[1], rotation.entries[2], rotation.entries[3]));
new_transform.setOrigin(old_origin);
ValidateTransform(new_transform);
body->setWorldTransform(new_transform);
}
-void BulletObject::SetPositionAndVel( const vec3 &position, int frames) {
- vec3 vel = (position - GetPosition())/game_timer.timestep;
+void BulletObject::SetPositionAndVel(const vec3 &position, int frames) {
+ vec3 vel = (position - GetPosition()) / game_timer.timestep;
vel /= (float)frames;
- //SetPosition(position);
+ // SetPosition(position);
SetLinearVelocity(vel);
}
-void BulletObject::SetRotationAndVel( const mat4 &rotation, int frames) {
+void BulletObject::SetRotationAndVel(const mat4 &rotation, int frames) {
btVector3 old_origin = body->getWorldTransform().getOrigin();
btTransform new_transform;
new_transform.setFromOpenGLMatrix(rotation.entries);
@@ -129,11 +129,11 @@ void BulletObject::SetRotationAndVel( const mat4 &rotation, int frames) {
angVel /= (float)frames;
body->setAngularVelocity(angVel);
-
- //body->setWorldTransform(new_transform);
+
+ // body->setWorldTransform(new_transform);
}
-void BulletObject::SetRotationAndVel( const quaternion &rotation, int frames) {
+void BulletObject::SetRotationAndVel(const quaternion &rotation, int frames) {
btVector3 old_origin = body->getWorldTransform().getOrigin();
btTransform new_transform;
new_transform.setRotation(btQuaternion(rotation.entries[0], rotation.entries[1], rotation.entries[2], rotation.entries[3]));
@@ -149,67 +149,64 @@ void BulletObject::SetRotationAndVel( const quaternion &rotation, int frames) {
angVel /= (float)frames;
body->setAngularVelocity(angVel);
-
- //body->setWorldTransform(new_transform);
-}
+ // body->setWorldTransform(new_transform);
+}
-void BulletObject::SetTransform( const vec4 &position, const mat4 &rotation, const vec4 &scale ) {
+void BulletObject::SetTransform(const vec4 &position, const mat4 &rotation, const vec4 &scale) {
btTransform bt_transform;
bt_transform.setIdentity();
- bt_transform.setFromOpenGLMatrix((btScalar*)rotation.entries);
+ bt_transform.setFromOpenGLMatrix((btScalar *)rotation.entries);
vec3 new_pos = position.xyz() + GetRotation() * com_offset;
bt_transform.setOrigin(btVector3(new_pos[0],
- new_pos[1],
- new_pos[2]));
+ new_pos[1],
+ new_pos[2]));
shape->setLocalScaling(btVector3(scale[0],
- scale[1],
- scale[2]));
+ scale[1],
+ scale[2]));
ValidateTransform(bt_transform);
body->setWorldTransform(bt_transform);
}
-void BulletObject::SetTransform( const mat4 &transform ) {
+void BulletObject::SetTransform(const mat4 &transform) {
btTransform bt_transform;
- bt_transform.setFromOpenGLMatrix((btScalar*)transform.entries);
+ bt_transform.setFromOpenGLMatrix((btScalar *)transform.entries);
ValidateTransform(bt_transform);
body->setWorldTransform(bt_transform);
}
-void BulletObject::ApplyTransform( const mat4& transform ) {
+void BulletObject::ApplyTransform(const mat4 &transform) {
mat4 old_transform_mat4 = SafeGetOpenGLMatrix(body->getWorldTransform());
old_transform_mat4 = transform * old_transform_mat4;
btTransform new_transform;
new_transform.setFromOpenGLMatrix(old_transform_mat4.entries);
ValidateTransform(new_transform);
body->setWorldTransform(new_transform);
-
}
-void BulletObject::SetGravity( bool gravity ) {
- if(!gravity){
- body->setGravity(btVector3(0.0f,0.0f,0.0f));
+void BulletObject::SetGravity(bool gravity) {
+ if (!gravity) {
+ body->setGravity(btVector3(0.0f, 0.0f, 0.0f));
} else {
- const vec3& grav = Physics::Instance()->gravity;
- body->setGravity(btVector3(grav[0],grav[1],grav[2]));
+ const vec3 &grav = Physics::Instance()->gravity;
+ body->setGravity(btVector3(grav[0], grav[1], grav[2]));
}
}
-vec3 BulletObject::GetVelocityAtLocalPoint(const vec3& point) {
+vec3 BulletObject::GetVelocityAtLocalPoint(const vec3 &point) {
btVector3 vel = body->getVelocityInLocalPoint(
btVector3(point[0], point[1], point[2]));
return vec3(vel[0], vel[1], vel[2]);
}
-void BulletObject::SetDamping( float damping ) {
- body->setDamping(damping,damping);
+void BulletObject::SetDamping(float damping) {
+ body->setDamping(damping, damping);
}
-void BulletObject::SetDamping( float lin_damping, float ang_damping ) {
- body->setDamping(lin_damping,ang_damping);
+void BulletObject::SetDamping(float lin_damping, float ang_damping) {
+ body->setDamping(lin_damping, ang_damping);
}
-
vec3 BulletObject::GetInterpPosition() {
return mix(old_transform.GetTranslationPart(),
transform.GetTranslationPart(),
@@ -234,86 +231,84 @@ mat4 BulletObject::GetInterpWeightRotation(float weight) {
weight);
}
-vec3 BulletObject::GetInterpPositionX( int num, int progress ) {
+vec3 BulletObject::GetInterpPositionX(int num, int progress) {
return mix(old_transform.GetTranslationPart(),
transform.GetTranslationPart(),
game_timer.GetInterpWeightX(num, progress));
}
-mat4 BulletObject::GetInterpRotationX( int num, int progress ) {
+mat4 BulletObject::GetInterpRotationX(int num, int progress) {
return mix(old_transform.GetRotationPart(),
transform.GetRotationPart(),
game_timer.GetInterpWeightX(num, progress));
}
-
-vec3 BulletObject::GetHistoryInterpPositionX( int num, int progress, float offset ) {
+vec3 BulletObject::GetHistoryInterpPositionX(int num, int progress, float offset) {
float t_e = game_timer.timestep_error - offset;
- float mult = (1.0f/(float)num);
- float temp_timestep_error = mult*(float)progress + t_e*mult;
+ float mult = (1.0f / (float)num);
+ float temp_timestep_error = mult * (float)progress + t_e * mult;
unsigned base = 0;
- while(temp_timestep_error < 0){
+ while (temp_timestep_error < 0) {
++base;
temp_timestep_error += 1.0f;
}
- if(base+1>=transform_history.size()){
- transform_history.resize(base+2, transform_history.back());
+ if (base + 1 >= transform_history.size()) {
+ transform_history.resize(base + 2, transform_history.back());
}
- return transform_history[base].GetTranslationPart()*temp_timestep_error+transform_history[base+1].GetTranslationPart()*(1.0f-temp_timestep_error);
+ return transform_history[base].GetTranslationPart() * temp_timestep_error + transform_history[base + 1].GetTranslationPart() * (1.0f - temp_timestep_error);
}
-mat4 BulletObject::GetHistoryInterpRotationX( int num, int progress, float offset ) {
+mat4 BulletObject::GetHistoryInterpRotationX(int num, int progress, float offset) {
float t_e = game_timer.timestep_error - offset;
- float mult = (1.0f/(float)num);
- float temp_timestep_error = mult*(float)progress + t_e*mult;
+ float mult = (1.0f / (float)num);
+ float temp_timestep_error = mult * (float)progress + t_e * mult;
unsigned base = 0;
- while(temp_timestep_error < 0){
+ while (temp_timestep_error < 0) {
++base;
temp_timestep_error += 1.0f;
}
- if(base+1>=transform_history.size()){
- transform_history.resize(base+2, transform_history.back());
+ if (base + 1 >= transform_history.size()) {
+ transform_history.resize(base + 2, transform_history.back());
}
- return transform_history[base].GetRotationPart()*temp_timestep_error+transform_history[base+1].GetRotationPart()*(1.0f-temp_timestep_error);
+ return transform_history[base].GetRotationPart() * temp_timestep_error + transform_history[base + 1].GetRotationPart() * (1.0f - temp_timestep_error);
}
void BulletObject::ClearVelocities() {
- body->setLinearVelocity(btVector3(0.0f,0.0f,0.0f));
- body->setAngularVelocity(btVector3(0.0f,0.0f,0.0f));
+ body->setLinearVelocity(btVector3(0.0f, 0.0f, 0.0f));
+ body->setAngularVelocity(btVector3(0.0f, 0.0f, 0.0f));
}
-void BulletObject::SetAngularVelocity( const vec3& vel ) {
- body->setAngularVelocity(btVector3(vel[0],vel[1],vel[2]));
+void BulletObject::SetAngularVelocity(const vec3 &vel) {
+ body->setAngularVelocity(btVector3(vel[0], vel[1], vel[2]));
}
-void BulletObject::SetLinearVelocity( const vec3& vel ) {
- body->setLinearVelocity(btVector3(vel[0],vel[1],vel[2]));
+void BulletObject::SetLinearVelocity(const vec3 &vel) {
+ body->setLinearVelocity(btVector3(vel[0], vel[1], vel[2]));
}
-void BulletObject::AddAngularVelocity( const vec3& vel ) {
+void BulletObject::AddAngularVelocity(const vec3 &vel) {
body->setAngularVelocity(body->getAngularVelocity() +
- btVector3(vel[0],vel[1],vel[2]));
+ btVector3(vel[0], vel[1], vel[2]));
}
-void BulletObject::AddLinearVelocity( const vec3& vel ) {
+void BulletObject::AddLinearVelocity(const vec3 &vel) {
body->setLinearVelocity(body->getLinearVelocity() +
- btVector3(vel[0],vel[1],vel[2]));
+ btVector3(vel[0], vel[1], vel[2]));
}
vec3 BulletObject::GetPosition() const {
btVector3 bt_origin = body->getWorldTransform().getOrigin();
vec3 com_display_offset = GetRotation() * -com_offset;
- return vec3(bt_origin[0],bt_origin[1],bt_origin[2])+com_display_offset;
+ return vec3(bt_origin[0], bt_origin[1], bt_origin[2]) + com_display_offset;
}
float BulletObject::GetMass() {
- return 1.0f/body->getInvMass();
+ return 1.0f / body->getInvMass();
}
-
vec3 BulletObject::GetLinearVelocity() const {
btVector3 vec = body->getLinearVelocity();
- return vec3(vec[0],vec[1],vec[2]);
+ return vec3(vec[0], vec[1], vec[2]);
}
mat4 BulletObject::GetRotation() const {
@@ -330,12 +325,12 @@ quaternion BulletObject::GetQuatRotation() {
return quaternion(vec4(quat.getX(), quat.getY(), quat.getZ(), quat.getW()));
}
-vec3 BulletObject::ObjectToWorld( const vec3 &point ) {
+vec3 BulletObject::ObjectToWorld(const vec3 &point) {
transform = SafeGetOpenGLMatrix(body->getWorldTransform());
- return transform*point;
+ return transform * point;
}
-void BulletObject::ApplyForceAtWorldPoint( const vec3 &point, const vec3 &impulse ) {
+void BulletObject::ApplyForceAtWorldPoint(const vec3 &point, const vec3 &impulse) {
vec3 local_point = WorldToObject(point);
body->applyForce(btVector3(impulse[0], impulse[1], impulse[2]),
btVector3(local_point[0], local_point[1], local_point[2]));
@@ -347,7 +342,7 @@ vec3 BulletObject::WorldToObject(const vec3 &world_point) {
return invert(transform) * world_point;
}
-void BulletObject::SetVisibility( const bool _visible ) {
+void BulletObject::SetVisibility(const bool _visible) {
visible = _visible;
}
@@ -360,12 +355,11 @@ void BulletObject::Activate() {
}
void BulletObject::Freeze() {
- body->setCollisionFlags(btCollisionObject::CF_KINEMATIC_OBJECT |
+ body->setCollisionFlags(btCollisionObject::CF_KINEMATIC_OBJECT |
btCollisionObject::CF_NO_CONTACT_RESPONSE);
body->setActivationState(ISLAND_SLEEPING);
}
-
void BulletObject::Sleep() {
body->setActivationState(ISLAND_SLEEPING);
}
@@ -392,7 +386,7 @@ void BulletObject::FixDiscontinuity() {
}
void BulletObject::Dispose() {
- if(body->getMotionState()){
+ if (body->getMotionState()) {
delete body->getMotionState();
}
delete body;
@@ -405,31 +399,27 @@ void BulletObject::SetShape(SharedShapePtr _shape) {
body->setCollisionShape(shape.get());
}
-BulletObject::BulletObject():
- body(NULL),
- com_offset(0.0f),
- owner_object(NULL),
- color(1.0f),
- keep_history(false)
-{}
+BulletObject::BulletObject() : body(NULL),
+ com_offset(0.0f),
+ owner_object(NULL),
+ color(1.0f),
+ keep_history(false) {}
BulletObject::~BulletObject() {
LOG_ASSERT(body == NULL);
// These should be NULL if Dispose() was called correctly
}
-void BulletObject::CopyObjectTransform( const BulletObject* other ) {
- //btTransform transform = other->body->getWorldTransform();
- //transform.setOrigin(transform.getOrigin()*0.5f);
- //body->setWorldTransform(transform);
+void BulletObject::CopyObjectTransform(const BulletObject *other) {
+ // btTransform transform = other->body->getWorldTransform();
+ // transform.setOrigin(transform.getOrigin()*0.5f);
+ // body->setWorldTransform(transform);
ValidateTransform(other->body->getWorldTransform());
body->setWorldTransform(other->body->getWorldTransform());
}
-
-void BulletObject::MixObjectTransform( const BulletObject* other,
- float how_much )
-{
+void BulletObject::MixObjectTransform(const BulletObject *other,
+ float how_much) {
const btTransform &other_transform = other->body->getWorldTransform();
btTransform this_transform = body->getWorldTransform();
/*
@@ -437,9 +427,9 @@ void BulletObject::MixObjectTransform( const BulletObject* other,
btQuaternion q2 = other_transform.getRotation();
*/
btQuaternion result = slerp(this_transform.getRotation(),
- other_transform.getRotation(),
- how_much);
- if(result[0] != result[0]){
+ other_transform.getRotation(),
+ how_much);
+ if (result[0] != result[0]) {
/*
btQuaternion result = slerp(this_transform.getRotation(),
other_transform.getRotation(),
@@ -455,9 +445,8 @@ void BulletObject::MixObjectTransform( const BulletObject* other,
body->setWorldTransform(this_transform);
}
-void BulletObject::MixObjectVel( const BulletObject* other,
- float how_much )
-{
+void BulletObject::MixObjectVel(const BulletObject *other,
+ float how_much) {
const btVector3 &other_lin_vel = other->body->getLinearVelocity();
const btVector3 &other_ang_vel = other->body->getAngularVelocity();
const btVector3 &this_lin_vel = body->getLinearVelocity();
@@ -467,14 +456,12 @@ void BulletObject::MixObjectVel( const BulletObject* other,
body->setAngularVelocity(this_ang_vel * (1.0f - how_much) + other_ang_vel * how_much);
}
-
-void BulletObject::CopyObjectVel( const BulletObject* other ) {
+void BulletObject::CopyObjectVel(const BulletObject *other) {
body->setLinearVelocity(other->body->getLinearVelocity());
body->setAngularVelocity(other->body->getAngularVelocity());
}
-
-void BulletObject::GetDisplayTransform(btTransform* display_transform) {
+void BulletObject::GetDisplayTransform(btTransform *display_transform) {
(*display_transform) = body->getWorldTransform();
btVector3 scale = shape->getLocalScaling();
scale[0] = fabs(scale[0]);
@@ -482,9 +469,9 @@ void BulletObject::GetDisplayTransform(btTransform* display_transform) {
scale[2] = fabs(scale[2]);
vec3 com_display_offset = GetRotation() * -com_offset;
display_transform->setOrigin(display_transform->getOrigin() +
- btVector3(com_display_offset[0],
- com_display_offset[1],
- com_display_offset[2]));
+ btVector3(com_display_offset[0],
+ com_display_offset[1],
+ com_display_offset[2]));
/*btMatrix3x3 basis = display_transform->getBasis();
basis[0] *= scale[0];
basis[4] *= scale[1];
@@ -495,10 +482,10 @@ void BulletObject::GetDisplayTransform(btTransform* display_transform) {
vec3 BulletObject::GetAngularVelocity() const {
btVector3 vec = body->getAngularVelocity();
- return vec3(vec[0],vec[1],vec[2]);
+ return vec3(vec[0], vec[1], vec[2]);
}
-void BulletObject::ApplyTorque( const vec3 &torque ) {
+void BulletObject::ApplyTorque(const vec3 &torque) {
btVector3 bt_torque(torque[0], torque[1], torque[2]);
body->applyTorque(bt_torque);
}
@@ -508,13 +495,13 @@ void BulletObject::UpdateTransform() {
GetDisplayTransform(&bt_transform);
old_transform = transform;
transform = SafeGetOpenGLMatrix(bt_transform);
- if(keep_history){
- if(transform_history.empty()){
+ if (keep_history) {
+ if (transform_history.empty()) {
transform_history.resize(1);
}
const size_t _history_size = transform_history.size();
- for(size_t i=0; i<_history_size-1; ++i){
- transform_history[_history_size-1-i] = transform_history[_history_size-2-i];
+ for (size_t i = 0; i < _history_size - 1; ++i) {
+ transform_history[_history_size - 1 - i] = transform_history[_history_size - 2 - i];
}
transform_history[0] = transform;
}
@@ -524,63 +511,61 @@ void BulletObject::CheckForNAN() {
btTransform bt_transform;
GetDisplayTransform(&bt_transform);
mat4 test_mat = SafeGetOpenGLMatrix(body->getWorldTransform());
- for(float entry : test_mat.entries){
- if(entry != entry){
+ for (float entry : test_mat.entries) {
+ if (entry != entry) {
LOGE << "NAN found in BulletObject" << std::endl;
break;
}
}
btMatrix3x3 mat = bt_transform.getBasis().inverse();
- if(mat.getColumn(0)[0] != mat.getColumn(0)[0]){
+ if (mat.getColumn(0)[0] != mat.getColumn(0)[0]) {
LOGE << "NAN found in BulletObject" << std::endl;
}
- const btVector3& vel = body->getLinearVelocity();
- for(unsigned i=0; i<3; ++i){
- if(vel[i] != vel[i]){
+ const btVector3 &vel = body->getLinearVelocity();
+ for (unsigned i = 0; i < 3; ++i) {
+ if (vel[i] != vel[i]) {
LOGE << "NAN found in BulletObject" << std::endl;
break;
}
- }
- const btVector3& vel2 = body->getAngularVelocity();
- for(unsigned i=0; i<3; ++i){
- if(vel2[i] != vel2[i]){
+ }
+ const btVector3 &vel2 = body->getAngularVelocity();
+ for (unsigned i = 0; i < 3; ++i) {
+ if (vel2[i] != vel2[i]) {
LOGE << "NAN found in BulletObject" << std::endl;
break;
}
}
}
-float BulletObject::GetMomentOfInertia( const vec3& axis ) {
+float BulletObject::GetMomentOfInertia(const vec3 &axis) {
btVector3 bt_axis(axis[0], axis[1], axis[2]);
- //bt_axis = quatRotate(body->getWorldTransform().getRotation().inverse(),bt_axis);
- return 1.0f/((body->getInvInertiaTensorWorld() * bt_axis * body->getAngularFactor()).dot(bt_axis));
+ // bt_axis = quatRotate(body->getWorldTransform().getRotation().inverse(),bt_axis);
+ return 1.0f / ((body->getInvInertiaTensorWorld() * bt_axis * body->getAngularFactor()).dot(bt_axis));
}
bool BulletObject::IsActive() {
int activation_state = body->getActivationState();
- return (activation_state==ACTIVE_TAG || activation_state==DISABLE_DEACTIVATION);
+ return (activation_state == ACTIVE_TAG || activation_state == DISABLE_DEACTIVATION);
}
-void BulletObject::Collided( const vec3& pos, float impulse, const CollideInfo &collide_info ) {
- if(owner_object){
+void BulletObject::Collided(const vec3 &pos, float impulse, const CollideInfo &collide_info) {
+ if (owner_object) {
owner_object->Collided(pos, impulse, collide_info, this);
}
}
-void BulletObject::SetMass( float mass ) {
+void BulletObject::SetMass(float mass) {
btVector3 inv_inertia = body->getInvInertiaDiagLocal();
inv_inertia[0] = 1.0f / inv_inertia[0];
inv_inertia[1] = 1.0f / inv_inertia[1];
inv_inertia[2] = 1.0f / inv_inertia[2];
body->setMassProps(mass, inv_inertia);
- const vec3& grav = Physics::Instance()->gravity;
- body->setGravity(btVector3(grav[0],grav[1],grav[2]));
+ const vec3 &grav = Physics::Instance()->gravity;
+ body->setGravity(btVector3(grav[0], grav[1], grav[2]));
}
-ShapeDisposalData::ShapeDisposalData():
- index_vert_array(NULL),
- triangle_info_map(NULL)
-{}
+ShapeDisposalData::ShapeDisposalData() : index_vert_array(NULL),
+ triangle_info_map(NULL) {}
ShapeDisposalData::~ShapeDisposalData() {
delete index_vert_array;