public PolygonShape Split(CollisionConvexPolygon collisionBox)
{
var collisionBoxCenter = collisionBox.GetCenter();
var destroyAll = false;
/*
// TODO: This structure is dead only if its area is less than a specific number, not because its center is destroyed
// Structure is dead
if (collisionBoxCenter.X > (_size.X / 2f - 2 * _step) + _parent.Position.X - _parent.Origin.X &&
collisionBoxCenter.X < (_size.X / 2f + 2 * _step) + _parent.Position.X - _parent.Origin.X)
{
destroyAll = true;
}
*/
// When we retrieve vertices, we need to transform them from world to local
var newPolygonShapeVertices = new List<Vector2>();
var newVertices = _polygonShape.Vertices.ToList();
if (!destroyAll)
{
// The part to remove is at left
if (collisionBoxCenter.X < _size.X / 2f)
{
var leftVertices = newVertices.FindAll(vertex => vertex.X <= collisionBoxCenter.X);
newPolygonShapeVertices.AddRange(leftVertices);
foreach (var vertex in leftVertices)
{
newVertices.Remove(vertex);
}
/*
foreach (var box in CollisionBoxes)
{
var center = box.GetCenter();
if (center.X <= minX + _parent.Position.X - _parent.Origin.X)
{
ParticleExplosion(center);
toDelete.Add(box);
}
}
foreach (var collisionElement in toDelete)
{
var box = (CollisionConvexPolygon) collisionElement;
CollisionBoxes.Remove(box);
_leftCollisionBoxes.Remove(box);
}
*/
}
// The part to remove is at right
else if (collisionBoxCenter.X > _size.X / 2f)
{
var rightVertices = newVertices.FindAll(vertex => vertex.X >= collisionBoxCenter.X);
newPolygonShapeVertices.AddRange(rightVertices);
foreach (var vertex in rightVertices)
newVertices.Remove(vertex);
/*
foreach (CollisionElement box in CollisionBoxes)
{
var center = box.GetCenter();
if (center.X >= maxX + _parent.Position.X - _parent.Origin.X)
{
ParticleExplosion(center);
toDelete.Add(box);
}
}
foreach (var collisionElement in toDelete)
{
var box = (CollisionConvexPolygon) collisionElement;
CollisionBoxes.Remove(box);
_rightCollisionBoxes.Remove(box);
}
*/
}
}
/*
else
{
foreach (var center in CollisionBoxes.Select(box => box.GetCenter()))
{
ParticleExplosion(center);
}
_leftCollisionBoxes.Clear();
_rightCollisionBoxes.Clear();
CollisionBoxes.Clear();
}
*/
/*
var vertices = new List<Vector2>();
vertices.AddRange(_bottomLeftVertices);
vertices.AddRange(_bottomRightVertices);
vertices.AddRange(_topRightVertices);
vertices.AddRange(_topLeftVertices);
*/
_polygonShape.UpdateVertices(newVertices.ToArray());
/*
if (_leftCollisionBoxes.Contains(collisionBox))
_leftCollisionBoxes.Remove(collisionBox);
else if (_rightCollisionBoxes.Contains(collisionBox))
_rightCollisionBoxes.Remove(collisionBox);
CollisionBoxes.Remove(collisionBox);
*/
var newPolygonShapeVerticesArray = newPolygonShapeVertices.ToArray();
if (newPolygonShapeVertices.Count > 0)
{
var newVerticesOriginPosition = newPolygonShapeVertices[0];
for (int i = 0; i < newPolygonShapeVerticesArray.Length; i++)
{
newPolygonShapeVerticesArray[i].X -= newVerticesOriginPosition.X;
}
}
else
newPolygonShapeVerticesArray = null;
return new PolygonShape(_gameRef, newPolygonShapeVerticesArray);
}