void IMS::SetCenterOfGravity(bool SetToZero)
{
ShiftCG(centerOfGravity * -1);
// ShiftCentreOfMass(centerOfGravity * -1);
// ShiftMeshes(centerOfGravity);
// ResetPointsToZero();
if (SetToZero)
{
// ShiftCG(centerOfGravity * -1);
centerOfGravity = _V(0,0,0);
massCenter = _V(0,0,0);
return;
}
// VESSELSTATUS2 stat;
// memset (&stat, 0, sizeof(stat));
// stat.version = 2;
// GetStatusEx(&stat);
// if (stat.status ==1)
// return;
// ShiftCG(centerOfGravity * -1);
VECTOR3 NewCOG = _V(0,0,0);
vector<int> ignoreX;
vector<int> ignoreY;
RefreshLoadedMass();
for (UINT i = 0; i < modules.size(); ++i)
//sieves through the modules and marks up modules that are in symetrical position on at least one axis with equal mass
{
//ignore modules close to 0,0,x for x+y axes
if (IsNear(modules[i]->pos.x, 0.0, 0.1))
{
ignoreX.push_back(i);
}
if (IsNear(modules[i]->pos.y, 0.0, 0.1))
{
ignoreY.push_back(i);
}
//check for symmetry in x+y axes
for (UINT j = i + 1; j < modules.size(); ++j)
{
if (IsNear(modules[i]->config.mass + modules[i]->loadedMass, modules[j]->config.mass + modules[j]->loadedMass, 0.01))
{
if (IsNear(modules[i]->pos.x * -1, modules[j]->pos.x, 0.5) &&
IsNear(modules[i]->pos.y * -1, modules[j]->pos.y, 0.5))
{
ignoreX.push_back(i);
ignoreX.push_back(j);
ignoreY.push_back(i);
ignoreY.push_back(j);
}
}
}
}
double runningMass = cmParams.config.mass + cmParams.loadedMass;
for (UINT i = 0; i < modules.size(); ++i)
{
bool _ignoreX = false;
bool _ignoreY = false;
VECTOR3 modPos = modules[i]->pos;
RoundVector(modPos);
// modPos -= NewCOG;
for (UINT j = 0; j < ignoreX.size(); ++j)
{
if (ignoreX[j] == i)
{
_ignoreX = true;
break;
}
}
for (UINT j = 0; j < ignoreY.size(); ++j)
{
if (ignoreY[j] == i)
{
_ignoreY = true;
break;
}
}
if (!_ignoreX)
{
NewCOG.x = ((NewCOG.x * runningMass) + (modPos.x * (modules[i]->config.mass + modules[i]->loadedMass))) / (runningMass + modules[i]->config.mass + modules[i]->loadedMass);
}
if (!_ignoreY)
{
NewCOG.y = ((NewCOG.y * runningMass) + (modPos.y * (modules[i]->config.mass + modules[i]->loadedMass))) / (runningMass + modules[i]->config.mass + modules[i]->loadedMass);
}
if (!IsNear(NewCOG.z, modPos.z, 0.1))
{
NewCOG.z = ((NewCOG.z * runningMass) + (modPos.z * (modules[i]->config.mass + modules[i]->loadedMass))) / (runningMass + modules[i]->config.mass + modules[i]->loadedMass);
}
// RoundVector(NewCOG, 100);
runningMass += modules[i]->config.mass + modules[i]->loadedMass;
}
//
RoundVector(NewCOG);
centerOfGravity = NewCOG;
massCenter = NewCOG;
if (COGInit) {
// AdjustStoredDocks(newCOG - centerOfGravity);
// ShiftCG(centerOfGravity - oldCoG);
ShiftCG(NewCOG);
// ShiftCentreOfMass(centerOfGravity);
// ShiftMeshes(centerOfGravity * -1);
// ResetPointsToCOG();
} else {
ShiftMeshes (NewCOG * -1);
// AdjustStoredDocks (shiftBack);
ResetPointsToCOG();
}
VECTOR3 tdFwd, tdLeft, tdRight;
tdFwd = cmParams.ttdFwd;
tdLeft = cmParams.ttdLeft;
tdRight = cmParams.ttdRight;
tdFwd -= NewCOG;
tdLeft -= NewCOG;
tdRight -= NewCOG;
SetTouchdownPoints (tdFwd, tdLeft, tdRight);
RedefineAirlockParams(SelectedAirlock);
AdjustThrusters();
}