public override void CalcBoundingBox2D() { ray2DEffects.Clear(); float timepassed = totalTime - lifeTime.TimeLeft; int length = positions.Length; BoundingBox2D box = null; IControlable source = weaponInfo.LastBody; for (int pos = 0; pos < length; ++pos) { if (timepassed >= startTimes[pos] && timepassed <= startTimes[pos] + lifeTimes[pos]) { Vector2D start = Vector2D.Rotate(source.Current.Position.Angular + positions[pos], Vector2D.XAxis) * source.BoundingRadius + source.Current.Position.Linear; Vector2D Direction = Vector2D.Rotate(source.Current.Position.Angular + directions[pos], Vector2D.XAxis); RaySegment2D segment = new RaySegment2D(start, Direction, distances[pos]); if (box == null) { box = segment.BoundingBox2D; } else { box = BoundingBox2D.From2BoundingBox2Ds(box, segment.BoundingBox2D); } ray2DEffects.Add(new SelectiveImpulseRay(lifeTime, segment, impulses[pos], BodyFlags.IgnoreGravity)); } } if (box == null) { box = new BoundingBox2D(Vector2D.Zero, Vector2D.Zero); } this.boundingBox2D = box; }
protected RayICollidableBodyPair GetIntersection(RaySegment2D raySegment, List <ICollidableBody> collidables) { int collidablesCount = collidables.Count; if (collidablesCount == 0) { return(null); } float Smallestdistance = raySegment.Length; RayICollidableBodyPair returnvalue = null; RayICollidableBodyPair pair; for (int pos = 0; pos < collidablesCount; ++pos) { pair = new RayICollidableBodyPair(raySegment, collidables[pos]); if (pair.TestIntersection()) { if (pair.BestIntersectInfo != null && Smallestdistance > pair.BestIntersectInfo.DistanceFromOrigin) { Smallestdistance = pair.BestIntersectInfo.DistanceFromOrigin; returnvalue = pair; } } } return(returnvalue); }
public SelectiveImpulseRay( LifeSpan lifeTime, RaySegment2D raySegment, float impulse, BodyFlags ignoreFlags) : base(lifeTime, raySegment, impulse) { this.ignoreFlags = ignoreFlags; }
public override void CalcBoundingBox2D() { IControlable source = weaponInfo.LastBody; IControlable target = weaponInfo.Target; Vector2D start = source.Current.Position.Linear; Vector2D end = target.Current.Position.Linear; Vector2D Direction = end - start; float Distance = Direction.Magnitude; Direction = Direction * (1 / Distance); RaySegment2D segment = new RaySegment2D(start, Direction, distance); ray2DEffects.Add(new SelectiveImpulseRay(lifeTime, segment, impulse, BodyFlags.IgnoreGravity)); this.boundingBox2D = segment.BoundingBox2D; }
protected void CalcEffects(LinkedList <Vector2D> points) { ray2DEffects = new List <IRay2DEffect>(points.Count - 1); Vector2D last = Vector2D.Zero; bool good = false; foreach (Vector2D point in points) { if (good) { Vector2D Direction = point - last; float Distance = Direction.Magnitude; Direction = Direction * (1 / Distance); RaySegment2D segment = new RaySegment2D(last, Direction, Distance); ray2DEffects.Add(new SelectiveImpulseRay(lifeTime, segment, impulse, BodyFlags.IgnoreGravity)); } good = true; last = point; } }