Esempio n. 1
0
        /// <summary>
        /// Calculates space rotate transformation between two quarters.
        /// </summary>
        /// <param name="iface">The interface symbolizing the two quarters join</param>
        /// <returns>The azimuth delta</returns>
        public static float ResolveQuarterAzimuthDelta(TownQuarterInterfacePosition mainQuarterPosition, TownQuarterInterfacePosition neighborQuarterPosition)
        {
            float angle = 0; //clockwise

            if (
                (mainQuarterPosition == TownQuarterInterfacePosition.Top && neighborQuarterPosition == TownQuarterInterfacePosition.Bottom) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Right && neighborQuarterPosition == TownQuarterInterfacePosition.Left) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Bottom && neighborQuarterPosition == TownQuarterInterfacePosition.Top) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Left && neighborQuarterPosition == TownQuarterInterfacePosition.Right)
                )
            {
                angle = 0;
            }
            else if (
                (mainQuarterPosition == TownQuarterInterfacePosition.Top && neighborQuarterPosition == TownQuarterInterfacePosition.Right) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Right && neighborQuarterPosition == TownQuarterInterfacePosition.Bottom) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Bottom && neighborQuarterPosition == TownQuarterInterfacePosition.Left) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Left && neighborQuarterPosition == TownQuarterInterfacePosition.Top)
                )
            {
                angle = MathHelper.PiOver2;
            }
            else if (
                (mainQuarterPosition == TownQuarterInterfacePosition.Top && neighborQuarterPosition == TownQuarterInterfacePosition.Top) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Right && neighborQuarterPosition == TownQuarterInterfacePosition.Right) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Bottom && neighborQuarterPosition == TownQuarterInterfacePosition.Bottom) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Left && neighborQuarterPosition == TownQuarterInterfacePosition.Left)
                )
            {
                angle = MathHelper.Pi;
            }
            else if (
                (mainQuarterPosition == TownQuarterInterfacePosition.Top && neighborQuarterPosition == TownQuarterInterfacePosition.Left) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Right && neighborQuarterPosition == TownQuarterInterfacePosition.Top) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Bottom && neighborQuarterPosition == TownQuarterInterfacePosition.Right) ||
                (mainQuarterPosition == TownQuarterInterfacePosition.Left && neighborQuarterPosition == TownQuarterInterfacePosition.Bottom)
                )
            {
                angle = (3f * MathHelper.PiOver2);
            }
            return(angle);
        }
Esempio n. 2
0
        /// <summary>
        /// Fills empty range of town quarter border with buildings. It takes it by dimension X - first fit.
        /// </summary>
        /// <param name="buildingModels">Availible models</param>
        /// <param name="borderPosition">Position of border - specifies side of rectangle</param>
        /// <param name="range">Empty range for filling</param>
        /// <param name="offset">Already filled part of range</param>
        private int FillEmptyBorderRange(Model[] buildingModels, TownQuarterInterfacePosition borderPosition, Range range, float offset, bool lastOne)
        {
            float emptySpace = (range.Length - 1) * SquareWidth - offset;
            foreach(Model model in buildingModels)
            {
                if (model.GetSize(game.Drawer.WorldTransformMatrix).X <= emptySpace)
                {
                    Model usedModel = model;
                    Vector3 usedModelSize = usedModel.GetSize(game.Drawer.WorldTransformMatrix);

                    float angle = 0;
                    Vector3 position = Vector3.Zero;
                    float newOffset = offset + usedModelSize.X;
                    switch (borderPosition)
                    {
                        case TownQuarterInterfacePosition.Top:
                            position = new Vector3(range.Begin * SquareWidth + SquareWidth + offset, 0, BlockWidth * SquareWidth - SquareWidth - usedModelSize.Z);
                            break;
                        case TownQuarterInterfacePosition.Right:
                            position = new Vector3(BlockWidth * SquareWidth - SquareWidth - usedModelSize.X / 2 + usedModelSize.Z / 2 + +(bitmapSize.Width - 2 * (BlockWidth - 1)) * SquareWidth, 0, range.Begin * SquareWidth + SquareWidth + offset + usedModelSize.X / 2 - usedModelSize.Z / 2);
                            angle = MathHelper.PiOver2;
                            break;
                        case TownQuarterInterfacePosition.Bottom:
                            position = new Vector3(range.Begin * SquareWidth + SquareWidth + offset, 0, BlockWidth * SquareWidth - SquareWidth + (bitmapSize.Height - 2 * (BlockWidth - 1)) * SquareWidth);
                            break;
                        case TownQuarterInterfacePosition.Left:
                            position = new Vector3(BlockWidth * SquareWidth - SquareWidth - usedModelSize.X / 2 - usedModelSize.Z / 2, 0, range.Begin * SquareWidth + SquareWidth + offset + usedModelSize.X / 2 - usedModelSize.Z / 2);
                            angle = MathHelper.PiOver2;
                            break;
                        default:
                            break;
                    }

                    SpatialObject borderBuilding = new SpatialObject(usedModel, this, position, angle, game.Drawer.WorldTransformMatrix);
                    solidObjects.AddLast(borderBuilding);
                    int recRes = 0;
                    if (!lastOne)
                    {
                        recRes = FillEmptyBorderRange(buildingModels, borderPosition, range, newOffset, false);
                    }
                    if (recRes == 0 && !lastOne)
                    {
                        Range overflowedRange = range;
                        overflowedRange.End++;
                        recRes = FillEmptyBorderRange(new Model[] {buildingModels.Last()}, borderPosition, overflowedRange, newOffset, true);
                    }
                    return recRes + 1;
                    //break;
                }
            }
            return 0;
        }
Esempio n. 3
0
 /// <summary>
 /// Calculates space rotate transformation between two quarters.
 /// </summary>
 /// <param name="iface">The interface symbolizing the two quarters join</param>
 /// <returns>The azimuth delta</returns>
 public static float ResolveQuarterAzimuthDelta(TownQuarterInterfacePosition mainQuarterPosition, TownQuarterInterfacePosition neighborQuarterPosition)
 {
     float angle = 0; //clockwise
     if (
            (mainQuarterPosition == TownQuarterInterfacePosition.Top && neighborQuarterPosition == TownQuarterInterfacePosition.Bottom)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Right && neighborQuarterPosition == TownQuarterInterfacePosition.Left)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Bottom && neighborQuarterPosition == TownQuarterInterfacePosition.Top)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Left && neighborQuarterPosition == TownQuarterInterfacePosition.Right)
         )
     {
         angle = 0;
     }
     else if (
            (mainQuarterPosition == TownQuarterInterfacePosition.Top && neighborQuarterPosition == TownQuarterInterfacePosition.Right)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Right && neighborQuarterPosition == TownQuarterInterfacePosition.Bottom)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Bottom && neighborQuarterPosition == TownQuarterInterfacePosition.Left)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Left && neighborQuarterPosition == TownQuarterInterfacePosition.Top)
         )
     {
         angle = MathHelper.PiOver2;
     }
     else if (
            (mainQuarterPosition == TownQuarterInterfacePosition.Top && neighborQuarterPosition == TownQuarterInterfacePosition.Top)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Right && neighborQuarterPosition == TownQuarterInterfacePosition.Right)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Bottom && neighborQuarterPosition == TownQuarterInterfacePosition.Bottom)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Left && neighborQuarterPosition == TownQuarterInterfacePosition.Left)
         )
     {
         angle = MathHelper.Pi;
     }
     else if (
            (mainQuarterPosition == TownQuarterInterfacePosition.Top && neighborQuarterPosition == TownQuarterInterfacePosition.Left)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Right && neighborQuarterPosition == TownQuarterInterfacePosition.Top)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Bottom && neighborQuarterPosition == TownQuarterInterfacePosition.Right)
         || (mainQuarterPosition == TownQuarterInterfacePosition.Left && neighborQuarterPosition == TownQuarterInterfacePosition.Bottom)
         )
     {
         angle = (3f * MathHelper.PiOver2);
     }
     return angle;
 }