/// <summary> /// Scale a CollisionUnit by the given amount. /// </summary> /// <param name="unit">The CollisionUnit to scale.</param> /// <param name="scale">The delta scale to perform on the CollisionUnit.</param> public void ScaleCollisionUnit(CollisionUnit unit, Vector2 scale) { int oldCircleRadius; int newCircleRadius; Vector2 circleCenter; Vector2 oldLineStart; Vector2 oldLineEnd; Point oldTopLeftCell; Point oldBottomRightCell; Point newTopLeftCell; Point newBottomRightCell; bool scaleFromCenter = false; if (unit.GetCollisionType() == CollisionUnit.CollisionType.COLLISION_CIRCLE || unit.GetCollisionType() == CollisionUnit.CollisionType.COLLISION_BOX) { if (unit.GetCollisionType() == CollisionUnit.CollisionType.COLLISION_CIRCLE) { oldCircleRadius = unit.GetCircleRadius(); //newCircleRadius = (int)(unit.GetCircleRadius() * ((scale.X + scale.Y) / 2)); //newCircleRadius = (int)(unit.GetCircleRadius() + unit.GetCircleRadius() * ((scale.X + scale.Y) / 2)); newCircleRadius = (int)(unit.GetCircleRadius() + ((scale.X + scale.Y) / 2)); circleCenter = unit.GetCircleCenter(); // calculate containing cells oldTopLeftCell = CalculateCircleTopLeftCell(circleCenter, oldCircleRadius); oldBottomRightCell = CalculateCircleBottomRightCell(circleCenter, oldCircleRadius); newTopLeftCell = CalculateCircleTopLeftCell(circleCenter, newCircleRadius); newBottomRightCell = CalculateCircleBottomRightCell(circleCenter, newCircleRadius); } else { Vector2 point1 = unit.GetUpperLeft(); Vector2 point2 = unit.GetLowerRight(); int oldWidth = unit.GetWidth(); int oldHeight = unit.GetHeight(); //int xChange = (int)(((oldWidth * scale.X) - oldWidth) / 2); //int yChange = (int)(((oldHeight * scale.Y) - oldHeight) / 2); //int xChange = (int)(oldWidth * scale.X / 2); //int yChange = (int)(oldHeight * scale.Y / 2); int xChange = (int)scale.X; int yChange = (int)scale.Y; // scale from center if (scaleFromCenter) { point1.X -= xChange; point1.Y -= yChange; point2.X += xChange; point2.Y += yChange; } else { // scale with top left stationary point2.X += xChange * 2; point2.Y += yChange * 2; } oldTopLeftCell = CalculateCellPosition(unit.GetUpperLeft()); oldBottomRightCell = CalculateCellPosition(unit.GetLowerRight()); newTopLeftCell = CalculateCellPosition(point1); newBottomRightCell = CalculateCellPosition(point2); } //if (scale.X < 1) if (scale.X < 0) { for (int j = oldTopLeftCell.Y; j <= oldBottomRightCell.Y; j++) { // remove left for (int i = oldTopLeftCell.X; i < newTopLeftCell.X; i++) { mCollisionGrid.Cells[i, j].RemoveCollisionUnit(unit); } // remove right for (int i = newBottomRightCell.X + 1; i <= oldBottomRightCell.X; i++) { mCollisionGrid.Cells[i, j].RemoveCollisionUnit(unit); } } //if (scale.Y < 1) if (scale.Y < 0) { for (int i = newTopLeftCell.X; i <= newBottomRightCell.X; i++) { // remove top for (int j = oldTopLeftCell.Y; j < newTopLeftCell.Y; j++) { mCollisionGrid.Cells[i, j].RemoveCollisionUnit(unit); } // remove bottom for (int j = newBottomRightCell.Y + 1; j <= oldBottomRightCell.Y; j++) { mCollisionGrid.Cells[i, j].RemoveCollisionUnit(unit); } } } //else if (scale.Y > 1) else if (scale.Y > 0) { for (int i = newTopLeftCell.X; i <= newBottomRightCell.X; i++) { // add top for (int j = newTopLeftCell.Y; j < oldTopLeftCell.Y; j++) { mCollisionGrid.Cells[i, j].AddCollisionUnit(unit); } // add bottom for (int j = oldBottomRightCell.Y + 1; j <= newBottomRightCell.Y; j++) { mCollisionGrid.Cells[i, j].AddCollisionUnit(unit); } } } } //else if (scale.X > 1) else if (scale.X > 0) { for (int j = newTopLeftCell.Y; j <= newBottomRightCell.Y; j++) { // add left for (int i = newTopLeftCell.X; i < oldTopLeftCell.X; i++) { mCollisionGrid.Cells[i, j].AddCollisionUnit(unit); } // add right for (int i = oldBottomRightCell.X + 1; i <= newBottomRightCell.X; i++) { mCollisionGrid.Cells[i, j].AddCollisionUnit(unit); } } //if (scale.Y < 1) if (scale.Y < 0) { for (int i = oldTopLeftCell.X; i <= oldBottomRightCell.X; i++) { // remove top for (int j = oldTopLeftCell.Y; j < newTopLeftCell.Y; j++) { mCollisionGrid.Cells[i, j].RemoveCollisionUnit(unit); } // remove bottom for (int j = newBottomRightCell.Y + 1; j <= oldBottomRightCell.Y; j++) { mCollisionGrid.Cells[i, j].RemoveCollisionUnit(unit); } } } //else if (scale.Y > 1) else if (scale.Y > 0) { for (int i = oldTopLeftCell.X; i <= oldBottomRightCell.X; i++) { // add top for (int j = newTopLeftCell.Y; j < oldTopLeftCell.Y; j++) { mCollisionGrid.Cells[i, j].AddCollisionUnit(unit); } // add bottom for (int j = oldBottomRightCell.Y + 1; j <= newBottomRightCell.Y; j++) { mCollisionGrid.Cells[i, j].AddCollisionUnit(unit); } } } } } else if (unit.GetCollisionType() == CollisionUnit.CollisionType.COLLISION_LINE) { oldLineStart = unit.GetLineStart(); oldLineEnd = unit.GetLineEnd(); // TODO: put in appropriate cells } }