/// <summary> /// Calculates point that the human is looking at. /// </summary> /// <param name="from">The eyes position</param> /// <param name="distance">Looking distance</param> /// <returns>The watched point</returns> Vector3 GetLookingAtCoordinates(Vector3 from, float distance) { float distance2D = (float)Math.Cos(lookAngle) * distance; Vector2 ret = from.XZToVector2().Go(distance2D, azimuth); return(ret.ToVector3((float)Math.Sin(lookAngle) * distance + from.Y)); }
public PointScatterRegion(Vector3 outerOrigin, float outerRadius, Vector3 innerOrigin, float innerRadius) { outerRect = new Rect(0, 0, 2f * outerRadius, 2f * outerRadius); outerRect.center = outerOrigin.XZToVector2(); innerRect = new Rect(0, 0, 2f * innerRadius, 2f * innerRadius); innerRect.center = innerOrigin.XZToVector2(); }
protected void Load(Model model, PositionInTown position, float verticalPosition, double azimuth, Matrix worldTransform) { this.model = model; this.verticalPosition = verticalPosition; Vector3 size = Vector3.Zero; if (model != null) { size = model.GetSize(worldTransform); verticalSize = size.Y; } base.Load(position, azimuth, size.XZToVector2()); }
/// <summary> /// Creates a new plate. /// </summary> /// <param name="homeQuarter">Town quarter where is it located</param> /// <param name="upperLeft">Upper left corner</param> /// <param name="upperRight">Upper right corner</param> /// <param name="lowerLeft">Lower left corner</param> /// <param name="lowerRight">Lower right corner</param> /// <param name="front">Front side texture</param> /// <param name="back">Back side texture</param> /// <param name="enableDefaultLightning">Determines if the default lightning is used</param> public Plate(TownQuarter homeQuarter, Vector3 upperLeft, Vector3 upperRight, Vector3 lowerLeft, Vector3 lowerRight, Texture2D front, Texture2D back, bool enableDefaultLightning) : base(upperLeft.XZToVector2(), upperRight.XZToVector2(), lowerLeft.XZToVector2(), lowerRight.XZToVector2()) { quarter = homeQuarter; ul = upperLeft; ur = upperRight; ll = lowerLeft; lr = lowerRight; this.back = back; this.front = front; graphicsDevice = front.GraphicsDevice; frontVertices = new VertexPositionNormalTexture[4]; backVertices = new VertexPositionNormalTexture[4]; indexes = new short[6]; BuildEffects(enableDefaultLightning); }
/// <summary> /// Builds the flag inside the quarter. /// </summary> private void BuildFlag() { Microsoft.Xna.Framework.Point square = GetRandomSquare(m => m == MapFillType.Road); flagPoint = square; Model flagModel = owner.Content.FlagModel; Vector3 flagSize = flagModel.GetSize(game.Drawer.WorldTransformMatrix); PositionInTown pos = new PositionInTown(this, ((square.ToVector2() + new Vector2(0.5f, 0.5f)) * SquareWidth) - (flagSize.XZToVector2() * 0.5f)); flag = new Flag(game, flagModel, pos, 0, game.Drawer.WorldTransformMatrix); solidObjects.AddLast(flag); }
/// <summary> /// Creates a new spatial object. /// </summary> /// <param name="model">Model</param> /// <param name="quarter">Town quarter</param> /// <param name="positionInQuarter">Position inside the town quarter</param> /// <param name="azimuth">Azimuth</param> /// <param name="worldTransform">World transform matrix</param> public SpatialObject(Model model, TownQuarter quarter, Vector3 positionInQuarter, double azimuth, Matrix worldTransform) : base(new PositionInTown(quarter, positionInQuarter.XZToVector2()), azimuth, (model == null? Vector2.Zero : model.GetSize(worldTransform).XZToVector2())) { Load(model, new PositionInTown(quarter, positionInQuarter.XZToVector2()), positionInQuarter.Y, azimuth, worldTransform); }
public static List<Vector3> ScatterPoints(this Rect rect, int count, float height, Rect notRect = new Rect()) { var current = new List<Vector3>(); int maxTimes = 50; while (maxTimes >= 0 && current.Count < count) { var y = height; var x = UnityEngine.Random.Range(rect.xMin, rect.xMax); var z = UnityEngine.Random.Range(rect.yMin, rect.yMax); var newP = new Vector3(x, y, z); if (!notRect.Contains(newP.XZToVector2()) && CanAdd(current, 4f, newP, out newP)) { current.Add(newP); } maxTimes--; } return current; }
static bool CanAdd(IEnumerable<Vector3> currentPoints, float minDistance, Vector3 point, out Vector3 hitPoint) { hitPoint = Vector3.zero; var sqrDist = minDistance * minDistance; foreach (var p in currentPoints) { if (Vector2.SqrMagnitude(point.XZToVector2() - p.XZToVector2()) < sqrDist) { return false; } } var ray = new Ray(point, Vector3.down); var hit = new RaycastHit(); if (Physics.Raycast(ray, out hit, 100f)) { if (hit.transform.gameObject.layer == LayerMask.NameToLayer(blockedLayer)) { return false; } else { hitPoint = hit.point; return true; } } else { return false; } }