94 lines
2.9 KiB
C++
94 lines
2.9 KiB
C++
#include "gamelib/effectphysics/effectphysicsproperties.h"
|
|
|
|
#include <algorithm>
|
|
|
|
idEffectPhysicsProperties::idEffectPhysicsProperties()
|
|
: broadPhase(nullptr)
|
|
, traceModelIndex(-1)
|
|
, mass(1.0f) {
|
|
}
|
|
|
|
void idEffectPhysicsProperties::Setup(
|
|
idEffectPhysicsBroadPhase *broadPhase_, const int traceModelIndex_,
|
|
const float requestedMass) {
|
|
linearFriction = 0.60000002f;
|
|
angularFriction = 0.60000002f;
|
|
contactFriction = 0.5f;
|
|
linearFrictionWater = 1.0f;
|
|
angularFrictionWater = 1.0f;
|
|
bouncyness = 0.60000002f;
|
|
clipMask = 1;
|
|
gravityVector.Set(0.0f, 0.0f, -250.0f);
|
|
worldCollisionOnly = false;
|
|
simplePointCollision = false;
|
|
crazyBounceChance = 0.0f;
|
|
inverseMass = 1.0f;
|
|
centerOfMass.Zero();
|
|
inertiaTensor = idMat3(1.0f);
|
|
inverseInertiaTensor = idMat3(1.0f);
|
|
maxLinearVelocity = 5000.0f;
|
|
stopSpeed = 10.0f;
|
|
maxAngularVelocity = 3.1415927f * 4.0f;
|
|
traceModelIndex = traceModelIndex_;
|
|
broadPhase = broadPhase_;
|
|
|
|
mass = 0.0f;
|
|
if (broadPhase != nullptr && broadPhase->traceModelCache != nullptr) {
|
|
broadPhase->traceModelCache->GetMassProperties(traceModelIndex, 1.0f,
|
|
mass, centerOfMass, inertiaTensor);
|
|
}
|
|
if (mass <= 0.0f) {
|
|
mass = 1.0f;
|
|
centerOfMass.Zero();
|
|
inertiaTensor = idMat3(1.0f);
|
|
}
|
|
|
|
const float massScale = requestedMass / mass;
|
|
for (int row = 0; row < 3; ++row) {
|
|
for (int column = 0; column < 3; ++column) {
|
|
inertiaTensor[row][column] *= massScale;
|
|
}
|
|
}
|
|
mass = requestedMass;
|
|
|
|
const float diagonal[3] = {
|
|
inertiaTensor[0][0], inertiaTensor[1][1], inertiaTensor[2][2]
|
|
};
|
|
int minimumAxis = 0;
|
|
if (diagonal[1] < diagonal[minimumAxis]) {
|
|
minimumAxis = 1;
|
|
}
|
|
if (diagonal[2] < diagonal[minimumAxis]) {
|
|
minimumAxis = 2;
|
|
}
|
|
|
|
if (diagonal[minimumAxis] > 0.0f) {
|
|
idMat3 inertiaScale(1.0f);
|
|
for (int axis = 0; axis < 3; ++axis) {
|
|
inertiaScale[axis][axis] = diagonal[axis]
|
|
/ diagonal[minimumAxis];
|
|
}
|
|
if (inertiaScale[0][0] > 4.0f || inertiaScale[1][1] > 4.0f
|
|
|| inertiaScale[2][2] > 4.0f) {
|
|
for (int axis = 0; axis < 3; ++axis) {
|
|
if (axis != minimumAxis && diagonal[axis] != 0.0f) {
|
|
inertiaScale[axis][axis] = diagonal[minimumAxis] * 4.0f
|
|
/ diagonal[axis];
|
|
}
|
|
}
|
|
inertiaTensor *= inertiaScale;
|
|
}
|
|
}
|
|
|
|
inverseMass = mass != 0.0f ? 1.0f / mass : 1.0f;
|
|
inverseInertiaTensor = inertiaTensor;
|
|
if (!inverseInertiaTensor.InverseSelf()) {
|
|
inverseInertiaTensor = idMat3(1.0f);
|
|
}
|
|
for (int row = 0; row < 3; ++row) {
|
|
for (int column = 0; column < 3; ++column) {
|
|
inverseInertiaTensor[row][column] *= 1.0f / 6.0f;
|
|
}
|
|
}
|
|
}
|