void CStructure::PostSetLocalTransform(const TMatrix& m) { BaseClass::PostSetLocalTransform(m); CPlanet* pPlanet = GameData().GetPlanet(); if (!pPlanet) return; if (!pPlanet->GetChunkManager()->HasGroupCenter()) return; TMatrix mLocalTransform = m; CBaseEntity* pMoveParent = GetMoveParent(); if (pMoveParent) { while (pMoveParent != pPlanet) { mLocalTransform = pMoveParent->GetLocalTransform() * mLocalTransform; pMoveParent = pMoveParent->GetMoveParent(); } } else mLocalTransform = pPlanet->GetGlobalToLocalTransform() * m; GameData().SetGroupTransform(pPlanet->GetChunkManager()->GetPlanetToGroupCenterTransform() * mLocalTransform.GetMeters()); }
void CStructure::SetPhysicsTransform(const Matrix4x4& m) { CPlanet* pPlanet = GameData().GetPlanet(); if (!pPlanet) { SetLocalTransform(TMatrix(m)); return; } if (!pPlanet->GetChunkManager()->HasGroupCenter()) { SetLocalTransform(TMatrix(m)); return; } GameData().SetGroupTransform(m); TMatrix mLocalTransform(pPlanet->GetChunkManager()->GetGroupCenterToPlanetTransform() * m); CBaseEntity* pMoveParent = GetMoveParent(); TAssert(pMoveParent); if (pMoveParent) { while (pMoveParent != pPlanet) { mLocalTransform = pMoveParent->GetLocalTransform().InvertedRT() * mLocalTransform; pMoveParent = pMoveParent->GetMoveParent(); } } SetLocalTransform(mLocalTransform); }