diff options
Diffstat (limited to 'Source/Physics/bulletobject.cpp')
-rw-r--r-- | Source/Physics/bulletobject.cpp | 257 |
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; |