
feat: + les cubes ajoutes s'arretent lorsqu'il y a collision avec le terrain, seulement sur un seul chunk
107 lines
3.0 KiB
C++
107 lines
3.0 KiB
C++
#include "physics.h"
|
|
|
|
|
|
Physics::Physics()
|
|
{
|
|
m_gravity = XMVectorSet(0.0f, -9.81f, 0.0f, 0.0f); // Initialize the gravity vector
|
|
}
|
|
|
|
Physics::Physics(const Physics& other)
|
|
{
|
|
m_gravity = other.m_gravity; // Copy the gravity value
|
|
}
|
|
|
|
Physics::~Physics()
|
|
{
|
|
}
|
|
|
|
// Get the gravity value
|
|
XMVECTOR Physics::GetGravity() const
|
|
{
|
|
return m_gravity;
|
|
}
|
|
|
|
// Define the gravity value
|
|
void Physics::SetGravity(XMVECTOR gravity)
|
|
{
|
|
m_gravity = gravity;
|
|
}
|
|
|
|
// Apply gravity to an object
|
|
void Physics::ApplyGravity(Object* object, float dragValue, float frameTime)
|
|
{
|
|
if (object == nullptr) // Verify if the object is not null
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Calculate the acceleration caused by gravity
|
|
XMVECTOR gravityAcceleration = m_gravity / object->GetMass();
|
|
|
|
// Add the gravity acceleration to the object's current acceleration
|
|
object->SetAcceleration(object->GetAcceleration() + gravityAcceleration);
|
|
|
|
// Calculate the acceleration caused by drag
|
|
XMVECTOR dragAcceleration = -object->GetVelocity() * dragValue / object->GetMass();
|
|
|
|
// Add the drag acceleration to the object's current acceleration
|
|
object->SetAcceleration(object->GetAcceleration() + dragAcceleration);
|
|
|
|
// Get the object velocity
|
|
XMVECTOR velocity = object->GetVelocity();
|
|
|
|
// Update the velocity with the object's acceleration
|
|
velocity += object->GetAcceleration() * frameTime;
|
|
|
|
// Set the new velocity
|
|
object->SetVelocity(velocity);
|
|
}
|
|
|
|
void Physics::ApplyForce(Object* object, XMVECTOR force)
|
|
{
|
|
if (object == nullptr) // Verify if the object is not null
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get the mass of the object
|
|
float mass = object->GetMass();
|
|
|
|
// Calculate the acceleration caused by the force
|
|
XMVECTOR acceleration = force / mass;
|
|
|
|
// Add the acceleration to the object's current acceleration
|
|
object->SetAcceleration(object->GetAcceleration() + acceleration);
|
|
}
|
|
|
|
bool Physics::IsColliding(Object* object1, Object* object2)
|
|
{
|
|
|
|
if (object1 == nullptr || object2 == nullptr) // Verify if the objects are not null
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Get the positions of the two objects
|
|
XMVECTOR position1 = object1->GetPosition();
|
|
XMVECTOR position2 = object2->GetPosition();
|
|
|
|
// Get the scale of the two objects (assuming the scale represents the size of the cube)
|
|
XMVECTOR scale1 = object1->GetScale();
|
|
XMVECTOR scale2 = object2->GetScale();
|
|
|
|
// Calculate the min and max coordinates of the two cubes
|
|
XMVECTOR min1 = position1 - scale1 / 2.0f;
|
|
XMVECTOR max1 = position1 + scale1 / 2.0f;
|
|
XMVECTOR min2 = position2 - scale2 / 2.0f;
|
|
XMVECTOR max2 = position2 + scale2 / 2.0f;
|
|
|
|
// Check if the two cubes overlap on all three axes
|
|
bool overlapX = max1.m128_f32[0] > min2.m128_f32[0] && min1.m128_f32[0] < max2.m128_f32[0];
|
|
bool overlapY = max1.m128_f32[1] > min2.m128_f32[1] && min1.m128_f32[1] < max2.m128_f32[1];
|
|
bool overlapZ = max1.m128_f32[2] > min2.m128_f32[2] && min1.m128_f32[2] < max2.m128_f32[2];
|
|
|
|
// If the cubes overlap on all three axes, they are colliding
|
|
return overlapX && overlapY && overlapZ;
|
|
}
|