-
-
Notifications
You must be signed in to change notification settings - Fork 424
/
CColCuboid.cpp
61 lines (51 loc) · 2.1 KB
/
CColCuboid.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*****************************************************************************
*
* PROJECT: Multi Theft Auto v1.0
* LICENSE: See LICENSE in the top level directory
* FILE: mods/deathmatch/logic/CColCuboid.cpp
* PURPOSE: Cube-shaped collision entity class
*
* Multi Theft Auto is available from http://www.multitheftauto.com/
*
*****************************************************************************/
#include "StdInc.h"
CColCuboid::CColCuboid(CColManager* pManager, CElement* pParent, const CVector& vecPosition, const CVector& vecSize) : CColShape(pManager, pParent)
{
m_vecPosition = vecPosition;
m_vecSize = vecSize;
UpdateSpatialData();
}
CElement* CColCuboid::Clone(bool* bAddEntity, CResource* pResource)
{
CColCuboid* pColCuboid = new CColCuboid(m_pManager, GetParentEntity(), m_vecPosition, m_vecSize);
return pColCuboid;
}
bool CColCuboid::DoHitDetection(const CVector& vecNowPosition)
{
// FIXME: What about radius?
// See if the now position is within our cube
return (vecNowPosition.fX >= m_vecPosition.fX && vecNowPosition.fX <= m_vecPosition.fX + m_vecSize.fX && vecNowPosition.fY >= m_vecPosition.fY &&
vecNowPosition.fY <= m_vecPosition.fY + m_vecSize.fY && vecNowPosition.fZ >= m_vecPosition.fZ &&
vecNowPosition.fZ <= m_vecPosition.fZ + m_vecSize.fZ);
}
bool CColCuboid::ReadSpecialData(const int iLine)
{
int iTemp;
if (GetCustomDataInt("dimension", iTemp, true))
m_usDimension = static_cast<unsigned short>(iTemp);
float fWidth = 1.0f, fDepth = 1.0f, fHeight = 1.0f;
GetCustomDataFloat("width", fWidth, true);
GetCustomDataFloat("depth", fDepth, true);
GetCustomDataFloat("height", fHeight, true);
m_vecSize.fX = fWidth;
m_vecSize.fY = fDepth;
m_vecSize.fZ = fHeight;
return true;
}
CSphere CColCuboid::GetWorldBoundingSphere()
{
CSphere sphere;
sphere.vecPosition = m_vecPosition + m_vecSize * 0.5f;
sphere.fRadius = std::max(std::max(m_vecSize.fX, m_vecSize.fY), m_vecSize.fZ) * 0.5f;
return sphere;
}