protected ControlableWave(ControlableWave copy) : base(copy) { this.Killed = Functions.Clone <EventHandler>(copy.Killed); this.shipState = new ShipState(copy.shipState); this.movementInfo = new ShipMovementInfo(copy.movementInfo); foreach (IControler controler in copy.controlers) { AddControler(null, (IControler)controler.Clone()); } this.target = copy.target; this.ControlHandler = Functions.Clone <IControlHandler>(copy.ControlHandler); this.currentControlInput = copy.currentControlInput; this.direction = copy.direction; this.controlableType = copy.controlableType; this.controlableSounds = copy.controlableSounds; this.attachedEffectCollection = new EffectCollection(copy.attachedEffectCollection); this.contFlags = copy.contFlags; this.CollisionState.GenerateRayEvents = true; this.colors = copy.colors; this.primaryColor = copy.primaryColor; if (copy.weaponInfo != null) { this.weaponInfo = (IWeaponsLogic)copy.weaponInfo.Clone(); } }
void DrawVertexes(WindowState state) { List <IControlable> BODIES = new List <IControlable>(world.Collidables); float baseradiusInc = (float)(MathHelper.PI * 2) / ((float)numberofCircleVertexes); float radiusInc = baseradiusInc; int numerofCV = numberofCircleVertexes; float sizedCV = 100; int color = defaultColor1.ToArgb(); int color2 = defaultColor2.ToArgb(); Matrix3x3 matrix = Matrix3x3.FromScale(new Vector2D(state.Scale, state.Scale)) * Matrix3x3.FromTranslate2D(state.Offset); foreach (IControlable body in BODIES) { if (body.BoundingBox2D == null || !body.IgnoreInfo.IsCollidable) { body.CalcBoundingBox2D(); } if (!state.ScreenBoundingBox.TestIntersection(body.BoundingBox2D) || body.IsExpired || body.IsInvisible) { continue; } ControlableWave wave = body as ControlableWave; if (body.ControlHandler != null && body.Target != null && !body.Target.IsExpired && !body.Target.IsInvisible && body.Controlers != null && body.Controlers.Length > 0) { Vector2D direction = Vector2D.Normalize(body.Target.Current.Position.Linear - body.Current.Position.Linear); Vector2D[] vertexes = new Vector2D[3]; vertexes[0] = body.Current.Position.Linear + direction * (body.BoundingRadius + 60); vertexes[1] = body.Current.Position.Linear + Vector2D.Rotate(MathHelper.PI / 24, direction) * (body.BoundingRadius + 20); vertexes[2] = body.Current.Position.Linear + Vector2D.Rotate(-MathHelper.PI / 24, direction) * (body.BoundingRadius + 20); //Vector2D.Transform(matrix, ref vertexes); OperationHelper.ArrayRefOp <Matrix3x3, Vector2D, Vector2D>( ref matrix, vertexes, vertexes, Vector2D.Multiply); Gl.glBegin(Gl.GL_POLYGON); SetColor(teamcolors[body.FactionInfo.FactionNumber]); Gl.glVertex3f(vertexes[0].X, vertexes[0].Y, 0); SetColor(teamcolors[0]); Gl.glVertex3f(vertexes[1].X, vertexes[1].Y, 0); Gl.glVertex3f(vertexes[2].X, vertexes[2].Y, 0); Gl.glEnd(); } foreach (Physics2D.ICollidableBodyPart part in body.CollidableParts) { //Gl.glLoadIdentity(); Gl.glBegin(Gl.GL_POLYGON); //IColoredPart colored = part as IColoredPart; if (part.UseCircleCollision) { if (part.BaseGeometry.BoundingRadius > sizedCV) { numerofCV = numberofCircleVertexes + (int)MathHelper.Sqrt(part.BaseGeometry.BoundingRadius - sizedCV); if (numerofCV > 100) { numerofCV = 100; } radiusInc = (float)(MathHelper.PI * 2) / ((float)numerofCV); } else { numerofCV = numberofCircleVertexes; radiusInc = baseradiusInc; } for (int angle = 0; angle != numerofCV; ++angle) { Vector2D vect = matrix * (Vector2D.FromLengthAndAngle(part.BaseGeometry.BoundingRadius, ((float)angle) * radiusInc + part.GoodPosition.Angular) + part.GoodPosition.Linear); int vectColor = color2; if (angle == 0) { vectColor = color; if (body != null) { vectColor = teamcolors[body.FactionInfo.FactionNumber]; } } if (wave != null) { if (wave.Colors.Length > angle) { vectColor = (wave.Colors[angle]); } else { if (wave.PrimaryColor != 0) { vectColor = (wave.PrimaryColor); } } } SetColor(vectColor); Gl.glVertex3f((float)vect.X, (float)vect.Y, 0); } //soundInfo.Add(points); } else { Vector2D[] vects = part.DisplayVertices; if (vects != null) { vects = OperationHelper.ArrayRefOp <Matrix3x3, Vector2D, Vector2D>( ref matrix, part.DisplayVertices, Vector2D.Multiply); //vects = Vector2D.Transform(matrix, part.DisplayVertices); for (int pos = 0; pos != vects.Length; ++pos) { int vectColor = color2; if (pos == 0) { vectColor = color; if (body != null) { vectColor = teamcolors[body.FactionInfo.FactionNumber]; } } SetColor(vectColor); Gl.glVertex3f((float)vects[pos].X, (float)vects[pos].Y, 0); } } } Gl.glEnd(); } } }