couch/core/Rigidbody.cpp

82 lines
2.2 KiB
C++
Raw Normal View History

2021-01-24 22:55:36 -06:00
#include "Rigidbody.h"
#include "World.h"
Rigidbody::Rigidbody() {
collisionShape = new btSphereShape(1.0f);
}
2021-01-24 22:55:36 -06:00
Rigidbody *Rigidbody::Create() {
return new Rigidbody;
}
Rigidbody *Rigidbody::Duplicate() {
Rigidbody *rigidbody = static_cast<Rigidbody*>(Spatial::Duplicate());
rigidbody->collisionShape = collisionShape;
rigidbody->btBody = btBody;
rigidbody->mass = mass;
return rigidbody;
}
Rigidbody *Rigidbody::Instance() {
Rigidbody *rigidbody = static_cast<Rigidbody*>(Node::Instance());
rigidbody->collisionShape = collisionShape;
2021-01-24 22:55:36 -06:00
rigidbody->btBody = new btRigidBody(rigidbody->mass, new RigidbodyMotionState(rigidbody), rigidbody->collisionShape);
rigidbody->btBody->setAngularFactor(character ? 0.0f : 1.0f);
2021-01-24 22:55:36 -06:00
World *world = World::GetWorld();
world->AddRigidbody(rigidbody);
return rigidbody;
}
void Rigidbody::SetCollisionShape(CollisionShape collisionShape) {
if (this->collisionShape) {
delete this->collisionShape;
}
this->collisionShape = collisionShape.shape;
}
void Rigidbody::ApplyImpulse(Vector3 impulse) {
btBody->applyCentralImpulse(btVector3(impulse.x, impulse.y, impulse.z));
}
void Rigidbody::ApplyForce(Vector3 force) {
btBody->applyCentralForce(btVector3(force.x, force.y, force.z));
}
void Rigidbody::SetCharacter(bool character) {
this->character = character;
}
2021-01-24 22:55:36 -06:00
RigidbodyMotionState::RigidbodyMotionState(Rigidbody *rigidbody) {
this->rigidbody = rigidbody;
}
void RigidbodyMotionState::getWorldTransform(btTransform &worldTrans) const {
2021-01-26 23:28:20 -06:00
Transform transform = rigidbody->GetTransform();
2021-01-24 22:55:36 -06:00
worldTrans.setOrigin(btVector3(
2021-01-26 23:28:20 -06:00
transform.position.x,
transform.position.y,
transform.position.z));
2021-01-24 22:55:36 -06:00
btQuaternion quat;
2021-01-26 23:28:20 -06:00
quat.setEuler(transform.rotation.z,
transform.rotation.y,
transform.rotation.x);
2021-01-24 22:55:36 -06:00
worldTrans.setRotation(quat);
}
void RigidbodyMotionState::setWorldTransform(const btTransform &worldTrans) {
2021-01-26 23:28:20 -06:00
Transform transform = rigidbody->GetTransform();
transform.position = Vector3(worldTrans.getOrigin().getX(),
2021-01-24 22:55:36 -06:00
worldTrans.getOrigin().getY(),
worldTrans.getOrigin().getZ());
2021-01-26 23:28:20 -06:00
worldTrans.getRotation().getEulerZYX(transform.rotation.z,
transform.rotation.y,
transform.rotation.x);
rigidbody->SetTransform(transform);
2021-01-24 22:55:36 -06:00
}