Files
botw/src/KingSystem/Physics/RigidBody/physRigidBody.cpp
T

101 lines
2.9 KiB
C++

#include "KingSystem/Physics/RigidBody/physRigidBody.h"
#include <Havok/Physics2012/Dynamics/Collide/hkpResponseModifier.h>
#include <Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h>
#include "KingSystem/Physics/System/physMemSystem.h"
namespace ksys::phys {
RigidBody::RigidBody(u32 a, u32 mass_scaling, hkpRigidBody* hk_body, const sead::SafeString& name,
sead::Heap* heap, bool a7)
: mCS(heap), mHkBody(hk_body), mRigidBodyAccessor(hk_body), _b4(a) {
if (!name.isEmpty()) {
mHkBody->setName(name.cstr());
}
mHkBody->setUserData(reinterpret_cast<hkUlong>(this));
mHkBody->m_motion.m_savedMotion = nullptr;
mHkBody->m_motion.m_motionState.m_timeFactor.setOne();
mHkBody->enableDeactivation(true);
mHkBody->getCollidableRw()->m_allowedPenetrationDepth = 0.1f;
if (mFlags.isOff(Flag::MassScaling)) {
mHkBody->m_responseModifierFlags |= hkpResponseModifier::Flags::MASS_SCALING;
}
mFlags.change(Flag::_80, _b4 == 5);
mFlags.change(Flag::MassScaling, mass_scaling == 1);
mFlags.change(Flag::_10, a7);
mFlags.set(Flag::_100);
}
sead::SafeString RigidBody::getName() const {
const char* name = mHkBody->getName();
if (!name)
return sead::SafeString::cEmptyString;
return name;
}
void RigidBody::setMotionFlag(MotionFlag flag) {
auto lock = sead::makeScopedLock(mCS);
mMotionFlags.set(flag);
if (mFlags.isOff(Flag::_20) && mFlags.isOff(Flag::_2)) {
mFlags.set(Flag::_2);
MemSystem::instance()->getRigidBodyRequestMgr()->sub_7100FA6C8C(
mFlags.isOn(Flag::MassScaling), this);
}
}
bool RigidBody::isActive() const {
return mHkBody->isActive();
}
bool RigidBody::sub_7100F8D1F8() const {
return mFlags.isOn(Flag::_8);
}
bool RigidBody::sub_7100F8D204() const {
return mMotionFlags.isOn(MotionFlag::_1);
}
bool RigidBody::sub_7100F8D210() const {
return mMotionFlags.isOn(MotionFlag::_2);
}
void RigidBody::sub_7100F8D21C() {
// debug code that survived because mFlags is atomic?
static_cast<void>(mFlags.isOn(Flag::_8));
auto lock = sead::makeScopedLock(mCS);
if (mMotionFlags.isOn(MotionFlag::_1)) {
mMotionFlags.reset(MotionFlag::_1);
mMotionFlags.set(MotionFlag::_2);
} else if (mFlags.isOn(Flag::_8)) {
setMotionFlag(MotionFlag::_2);
}
}
MotionType RigidBody::getMotionInfo() const {
if (mMotionFlags.isOn(MotionFlag::Dynamic))
return MotionType::Dynamic;
if (mMotionFlags.isOn(MotionFlag::Keyframed))
return MotionType::Keyframed;
if (mMotionFlags.isOn(MotionFlag::Fixed))
return MotionType::Fixed;
return mRigidBodyAccessor.getMotionType();
}
void RigidBody::setContactMask(u32 value) {
mContactMask.setDirect(value);
}
void RigidBody::setContactAll() {
mContactMask.makeAllOne();
}
void RigidBody::setContactNone() {
mContactMask.makeAllZero();
}
} // namespace ksys::phys