forked from Tr0n/client
Solution refactoring and restructuring, removed Boost dependency, removed unused tools
This commit is contained in:
177
src/GameLib/PhysicsObject.cpp
Normal file
177
src/GameLib/PhysicsObject.cpp
Normal file
@ -0,0 +1,177 @@
|
||||
#include "StdAfx.h"
|
||||
#include "PhysicsObject.h"
|
||||
|
||||
const float c_fFrameTime = 0.02f;
|
||||
const float EPSILON = 0.001f;
|
||||
|
||||
IPhysicsWorld* IPhysicsWorld::ms_pWorld = NULL;
|
||||
IObjectManager* IObjectManager::ms_ObjManager = NULL;
|
||||
|
||||
void CPhysicsObject::Update(float fElapsedTime)
|
||||
{
|
||||
if (m_xPushingPosition.isPlaying())
|
||||
m_xPushingPosition.Interpolate(fElapsedTime);
|
||||
if (m_yPushingPosition.isPlaying())
|
||||
m_yPushingPosition.Interpolate(fElapsedTime);
|
||||
}
|
||||
|
||||
void CPhysicsObject::Accumulate(D3DXVECTOR3 * pv3Position)
|
||||
{
|
||||
// If object is moving, give minor power to object.
|
||||
float fForce = 0.0f;
|
||||
|
||||
if (fabs(m_v3Velocity.x) < EPSILON ||
|
||||
fabs(m_v3Velocity.y) < EPSILON ||
|
||||
fabs(m_v3Velocity.z) < EPSILON )
|
||||
{
|
||||
fForce -= (m_fMass * m_fFriction);
|
||||
}
|
||||
|
||||
m_v3Acceleration = m_v3Direction * (fForce / m_fMass);
|
||||
m_v3Velocity += m_v3Acceleration;
|
||||
if (m_v3Velocity.x * m_v3Direction.x < EPSILON)
|
||||
{
|
||||
m_v3Velocity.x = 0.0f;
|
||||
m_v3Direction.x = 0.0f;
|
||||
}
|
||||
if (m_v3Velocity.y * m_v3Direction.y < EPSILON)
|
||||
{
|
||||
m_v3Velocity.y = 0.0f;
|
||||
m_v3Direction.y = 0.0f;
|
||||
}
|
||||
if (m_v3Velocity.z * m_v3Direction.z < EPSILON)
|
||||
{
|
||||
m_v3Velocity.z = 0.0f;
|
||||
m_v3Direction.z = 0.0f;
|
||||
}
|
||||
|
||||
pv3Position->x += m_v3Velocity.x;
|
||||
pv3Position->y += m_v3Velocity.y;
|
||||
pv3Position->z += m_v3Velocity.z;
|
||||
}
|
||||
|
||||
void CPhysicsObject::IncreaseExternalForce(const D3DXVECTOR3 & c_rvBasePosition, float fForce)
|
||||
{
|
||||
// Accumulate Acceleration by External Force
|
||||
m_v3Acceleration = m_v3Direction * (fForce / m_fMass);
|
||||
m_v3Velocity = m_v3Acceleration;
|
||||
/*
|
||||
Tracenf("force %f, mass %f, accel (%f, %f, %f)", fForce, m_fMass,
|
||||
m_v3Acceleration.x,
|
||||
m_v3Acceleration.y,
|
||||
m_v3Acceleration.z);
|
||||
*/
|
||||
// NOTE : <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>صд<D8B5>. <20>ٵ<EFBFBD> 100<30><30><EFBFBD><EFBFBD> ũ<>ٸ<EFBFBD>? ;
|
||||
const int LoopValue = 100;
|
||||
D3DXVECTOR3 v3Movement(0.0f, 0.0f, 0.0f);
|
||||
|
||||
for(int i = 0; i < LoopValue; ++i)
|
||||
{
|
||||
Accumulate(&v3Movement);
|
||||
|
||||
// VICTIM_COLLISION_TEST
|
||||
IPhysicsWorld* pWorld = IPhysicsWorld::GetPhysicsWorld();
|
||||
if (pWorld)
|
||||
{
|
||||
if (pWorld->isPhysicalCollision(c_rvBasePosition + v3Movement))
|
||||
{
|
||||
Initialize();
|
||||
return;
|
||||
|
||||
//for (float fRatio = 0.0f; fRatio < 1.0f; fRatio += 0.1f)
|
||||
//{
|
||||
// // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> üũ<C3BC>Ѵ<EFBFBD>
|
||||
// if (pWorld->isPhysicalCollision(c_rvBasePosition + v3Movement * fRatio))
|
||||
// {
|
||||
// v3Movement = D3DXVECTOR3 (0.0f, 0.0f, 0.0f);
|
||||
// break;
|
||||
// }
|
||||
//}
|
||||
//break;
|
||||
}
|
||||
}
|
||||
// VICTIM_COLLISION_TEST_END
|
||||
|
||||
if (fabs(m_v3Velocity.x) < EPSILON &&
|
||||
fabs(m_v3Velocity.y) < EPSILON &&
|
||||
fabs(m_v3Velocity.z) < EPSILON )
|
||||
break;
|
||||
}
|
||||
|
||||
SetLastPosition(v3Movement, float(LoopValue) * c_fFrameTime);
|
||||
|
||||
if( m_pActorInstance )
|
||||
{
|
||||
IObjectManager* pObjectManager = IObjectManager::GetObjectManager();
|
||||
pObjectManager->AdjustCollisionWithOtherObjects( m_pActorInstance );
|
||||
}
|
||||
}
|
||||
|
||||
void CPhysicsObject::SetLastPosition(const TPixelPosition & c_rPosition, float fBlendingTime)
|
||||
{
|
||||
m_v3LastPosition.x = float(c_rPosition.x);
|
||||
m_v3LastPosition.y = float(c_rPosition.y);
|
||||
m_v3LastPosition.z = float(c_rPosition.z);
|
||||
m_xPushingPosition.Setup(0.0f, c_rPosition.x, fBlendingTime);
|
||||
m_yPushingPosition.Setup(0.0f, c_rPosition.y, fBlendingTime);
|
||||
}
|
||||
|
||||
void CPhysicsObject::GetLastPosition(TPixelPosition * pPosition)
|
||||
{
|
||||
pPosition->x = (m_v3LastPosition.x);
|
||||
pPosition->y = (m_v3LastPosition.y);
|
||||
pPosition->z = (m_v3LastPosition.z);
|
||||
}
|
||||
|
||||
void CPhysicsObject::SetDirection(const D3DXVECTOR3 & c_rv3Direction)
|
||||
{
|
||||
m_v3Direction.x = c_rv3Direction.x;
|
||||
m_v3Direction.y = c_rv3Direction.y;
|
||||
m_v3Direction.z = c_rv3Direction.z;
|
||||
}
|
||||
|
||||
float CPhysicsObject::GetXMovement()
|
||||
{
|
||||
return m_xPushingPosition.GetChangingValue();
|
||||
}
|
||||
|
||||
float CPhysicsObject::GetYMovement()
|
||||
{
|
||||
return m_yPushingPosition.GetChangingValue();
|
||||
}
|
||||
|
||||
bool CPhysicsObject::isBlending()
|
||||
{
|
||||
// NOTE : IncreaseExternalForce() <20><> <20><><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
|
||||
if (0.0f != D3DXVec3Length(&m_v3Velocity))
|
||||
return true;
|
||||
|
||||
// NOTE : SetLastPosition() <20><> <20><><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
|
||||
if (m_xPushingPosition.isPlaying() ||
|
||||
m_yPushingPosition.isPlaying())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CPhysicsObject::Initialize()
|
||||
{
|
||||
m_fMass = 1.0f;
|
||||
m_fFriction = 0.3f;
|
||||
m_v3Direction = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
|
||||
m_v3Acceleration = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
|
||||
m_v3Velocity = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
|
||||
m_v3LastPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
m_xPushingPosition.Initialize();
|
||||
m_yPushingPosition.Initialize();
|
||||
}
|
||||
|
||||
CPhysicsObject::CPhysicsObject()
|
||||
{
|
||||
m_pActorInstance = NULL;
|
||||
}
|
||||
|
||||
CPhysicsObject::~CPhysicsObject()
|
||||
{
|
||||
}
|
Reference in New Issue
Block a user