engine/src/PhysicsManager/PhysicsManager.cpp

138 lines
3.7 KiB
C++

#include "include/PhysicsManager/PhysicsManager.h"
#include "include/ModelManager/NewModelManager.h"
#include "include/ShaderManager/ShaderManager.h"
namespace SE
{
const int CONST_MAX_VOLUME_STACK = 64;
void TVolumeBody::AssignFromFlexModel(TFlexModel& flexModel)
{
SmpTriangleArr.clear();
TDataTriangleList& dataTriangleList = flexModel.GetDataTriangleList();
if (dataTriangleList.Vec3CoordArr.count(CONST_STRING_POSITION_ATTRIB) == 0)
{
throw ErrorToLog("Error in AssignFromFlexModel - empty flexModel!");
}
if (dataTriangleList.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].size() == 0)
{
throw ErrorToLog("Error in AssignFromFlexModel - empty flexModel! size == 0!");
}
DimensionalMinPos = dataTriangleList.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][0];
DimensionalMaxPos = dataTriangleList.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][0];
for (size_t j = 0; j < dataTriangleList.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].size(); j+=3)
{
TSmpTriangle smpTriangle;
smpTriangle.p[0] = dataTriangleList.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][j];
smpTriangle.p[1] = dataTriangleList.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][j + 1];
smpTriangle.p[2] = dataTriangleList.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB][j + 2];
smpTriangle.v = smpTriangle.p[1] - smpTriangle.p[0];
smpTriangle.w = smpTriangle.p[2] - smpTriangle.p[1];
smpTriangle.n = CrossProduct(smpTriangle.v, smpTriangle.w);
SmpTriangleArr.push_back(smpTriangle);
DimensionalMinPos.v[0] = min(min(min(DimensionalMinPos.v[0], smpTriangle.p[0].v[0]), smpTriangle.p[1].v[0]), smpTriangle.p[2].v[0]);
DimensionalMinPos.v[1] = min(min(min(DimensionalMinPos.v[1], smpTriangle.p[0].v[1]), smpTriangle.p[1].v[1]), smpTriangle.p[2].v[1]);
DimensionalMinPos.v[2] = min(min(min(DimensionalMinPos.v[2], smpTriangle.p[0].v[2]), smpTriangle.p[1].v[2]), smpTriangle.p[2].v[2]);
DimensionalMaxPos.v[0] = max(max(max(DimensionalMaxPos.v[0], smpTriangle.p[0].v[0]), smpTriangle.p[1].v[0]), smpTriangle.p[2].v[0]);
DimensionalMaxPos.v[1] = max(max(max(DimensionalMaxPos.v[1], smpTriangle.p[0].v[1]), smpTriangle.p[1].v[1]), smpTriangle.p[2].v[1]);
DimensionalMaxPos.v[2] = max(max(max(DimensionalMaxPos.v[2], smpTriangle.p[0].v[2]), smpTriangle.p[1].v[2]), smpTriangle.p[2].v[2]);
}
}
void TVolumeBody::PushData()
{
if (SmpTriangleArrStack.size() >= CONST_MAX_VOLUME_STACK)
{
throw ErrorToLog("TVolumeBody::PushData - stack overflow");
}
SmpTriangleArrStack.push(SmpTriangleArr);
}
void TVolumeBody::PopData()
{
if (SmpTriangleArrStack.size() <= 0)
{
throw ErrorToLog("TVolumeBody::PushData - stack underflow");
}
SmpTriangleArr = SmpTriangleArrStack.top();
SmpTriangleArrStack.pop();
}
void TVolumeBody::Move(const vec3& v)
{
BOOST_FOREACH(TSmpTriangle& smpTriangle, SmpTriangleArr)
{
smpTriangle.p[0] -= v;
smpTriangle.p[1] -= v;
smpTriangle.p[2] -= v;
}
}
void TVolumeBody::Rotate(const mat3& r)
{
throw ErrorToLog("TVolumeBody::Rotate not implemented yet!");
}
void TVolumeBody::Scale(float s)
{
throw ErrorToLog("TVolumeBody::Scale not implemented yet!");
}
void TVolumeBody::Scale(const vec3& s)
{
throw ErrorToLog("TVolumeBody::Scale not implemented yet!");
}
bool TVolumeBody::CheckCollision(const vec3& a, const vec3& b)
{
for (int i=0; i<3; i++)
{
if (max(a.v[i], b.v[i]) < DimensionalMinPos.v[i])
{
return false;
}
if (min(a.v[i], b.v[i]) > DimensionalMaxPos.v[i])
{
return false;
}
}
BOOST_FOREACH(TSmpTriangle& smpTriangle, SmpTriangleArr)
{
if (LineCouldCrossTriangle(a, b, smpTriangle))
{
if (LineCrossTriangle(a, b, smpTriangle) == 1)
{
return true;
}
}
}
return false;
}
} //namespace SE