97 lines
3.2 KiB
C++
97 lines
3.2 KiB
C++
#pragma once
|
|
|
|
#include "gamelib/effectphysics/effectphysicsproperties.h"
|
|
#include "idlib/math/rotation.h"
|
|
|
|
struct impactInfo_t;
|
|
struct trace_t;
|
|
|
|
// Recovered type 14579. This record is intentionally independent of the
|
|
// renderer/game declaration layer so effect physics can be used by emitters.
|
|
struct idEffectPhysicsCollision {
|
|
idVec3 collisionPoint;
|
|
idVec3 collisionNormalVelocity;
|
|
int collisionSurfaceType;
|
|
|
|
void Clear() {
|
|
collisionPoint.Zero();
|
|
collisionNormalVelocity.Zero();
|
|
collisionSurfaceType = 0;
|
|
}
|
|
};
|
|
|
|
class alignas(8) idEffectPhysicsRigidBody {
|
|
public:
|
|
struct effectRBState_t {
|
|
idVec3 position;
|
|
idMat3 orientation;
|
|
idVec3 linearMomentum;
|
|
idVec3 angularMomentum;
|
|
idVec3 externalForce;
|
|
idVec3 externalTorque;
|
|
};
|
|
|
|
struct effectRBDelta_t {
|
|
idVec3 translation;
|
|
idRotation rotation;
|
|
idVec3 linearForce;
|
|
idVec3 angularForce;
|
|
};
|
|
|
|
idEffectPhysicsRigidBody();
|
|
~idEffectPhysicsRigidBody();
|
|
|
|
void Setup(const idEffectPhysicsProperties* props);
|
|
void ApplyImpulse(const idVec3& point, const idVec3& impulse);
|
|
void Update(float deltaTime, float extraMomentumDecay,
|
|
idEffectPhysicsCollision& collision);
|
|
|
|
void SetPosition(const idVec3& position, const idMat3& orientation) {
|
|
currentState.position = position;
|
|
currentState.orientation = orientation;
|
|
if (properties != nullptr && properties->broadPhase != nullptr) {
|
|
properties->broadPhase->SetObjectPosition(
|
|
&SPObject, position, orientation, nullptr);
|
|
}
|
|
}
|
|
void SetLinearMomentum(const idVec3& momentum) {
|
|
currentState.linearMomentum = momentum;
|
|
}
|
|
void SetAngularMomentum(const idVec3& momentum) {
|
|
currentState.angularMomentum = momentum;
|
|
}
|
|
void AddForce(const idVec3& force) {
|
|
currentState.externalForce = currentState.externalForce + force;
|
|
}
|
|
void AddTorque(const idVec3& torque) {
|
|
currentState.externalTorque = currentState.externalTorque + torque;
|
|
}
|
|
void Activate() { active = true; settled = false; }
|
|
void PutToRest() { settled = true; SPObject.motion.valid = false; }
|
|
|
|
const idEffectPhysicsProperties* properties;
|
|
effectRBState_t currentState;
|
|
idSPObject SPObject;
|
|
bool active;
|
|
bool settled;
|
|
|
|
private:
|
|
void CapVelocity(float deltaTime, effectRBState_t& current) const;
|
|
void CollisionImpulse(trace_t& collision, const impactInfo_t& impact,
|
|
float extraMomentumDecay, effectRBState_t& state,
|
|
idVec3& normalVelocity, idVec3& impulse) const;
|
|
void Evolve(float deltaTime, const effectRBState_t& current,
|
|
effectRBDelta_t& delta) const;
|
|
};
|
|
|
|
static_assert(sizeof(idEffectPhysicsCollision) == 28,
|
|
"Recovered idEffectPhysicsCollision ABI changed");
|
|
static_assert(sizeof(idEffectPhysicsRigidBody::effectRBState_t) == 96,
|
|
"Recovered effectRBState_t ABI changed");
|
|
static_assert(sizeof(idEffectPhysicsRigidBody::effectRBDelta_t) == 104,
|
|
"Recovered effectRBDelta_t ABI changed");
|
|
#if defined(_WIN32) && !defined(_WIN64)
|
|
static_assert(sizeof(idEffectPhysicsRigidBody) == 272,
|
|
"Recovered idEffectPhysicsRigidBody ABI changed");
|
|
#endif
|