public virtual void Update(float elapsed) { List <float> angles = new List <float>(); foreach (var castObject in castObjects) { castObject.RelAngles(position, angles); } const float small = 0.0001f; int oldAngleCount = angles.Count; for (int i = 0; i < oldAngleCount; i++) { angles.Add(angles[i] + small); angles.Add(angles[i] - small); } PrepareAngles(ref angles); List <Vector2> vertices = new List <Vector2>(); float maxDist = 2000; for (int i = 0; i < angles.Count; i++) { float angle = angles[i]; Vector2 rayDir = new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)); List <float> dists = new List <float>(); float minDist = maxDist; foreach (var castObject in castObjects) { castObject.InterPoint(position, rayDir, dists); } foreach (float dist in dists) { float d = dist + 1f; if (d >= 0 && d < minDist) { minDist = d; } } vertices.Add(position + minDist * rayDir); } if (maxAngleDiff * 2 < MathHelper.TwoPi) { vertices.Add(position); } polygon.Update(position, vertices); }
public virtual void Update(float elapsed) { List <AngleObj> angles = new List <AngleObj>(); foreach (var castObject in castObjects) { castObject.RelAngles(position, angles); } const float small = 0.0001f; int oldAngleCount = angles.Count; for (int i = 0; i < oldAngleCount; i++) { angles.Add(new AngleObj(angles[i].angle + small, angles[i].castingObject)); //angles.Add(angles[i] - small); angles[i].angle -= small; } float maxDist = 2000; Empty empty = new Empty(maxDist); empty.RelAngles(position, angles); for (int i = 0; i < angles.Count; i++) { angles[i].angle = MathHelper.WrapAngle(angles[i].angle); } angles.Sort(); //PrepareAngles(ref angles); List <Vector2> vertices = new List <Vector2>(); HashSet <IShadowCastingObject> curObj = new HashSet <IShadowCastingObject>() { empty, }; foreach (var castObject in castObjects) { angle = -MathHelper.Pi; if (!IfMisses(castObject)) { curObj.Add(castObject); } } for (int i = 0; i < angles.Count; i++) { angle = angles[i].angle; curObj.RemoveWhere(IfMisses); curObj.Add(angles[i].castingObject); if (/*Keyboard.GetState().IsKeyDown(Keys.Space) && */ curObj.Count > 50) { ; } Vector2 rayDir = Dir(angle); List <float> dists = new List <float>(); float minDist = maxDist; foreach (var castObject in curObj) { castObject.InterPoint(position, rayDir, dists); } foreach (float dist in dists) { float d = dist; if (d >= 0 && d < minDist) { minDist = d; } } vertices.Add(position + minDist * rayDir); } if (maxAngleDiff * 2 < MathHelper.TwoPi) { vertices.Add(position); } polygon.Update(position, vertices); }