private void RenderAvatars(Graphics context) { var clientSize = context.Bounds; var yCenter = clientSize.Height * Definitions.BaseLineYPosition; var diameter = Definitions.AvatarCircleDiameter; var radius = Definitions.AvatarCircleRadius; var fill = _avatarFill; var stroke = _avatarBorderStroke; var xStart = NotesLayerUtils.GetAvatarXPosition(clientSize, NotePosition.Min) - diameter; var xEnd = NotesLayerUtils.GetAvatarXPosition(clientSize, NotePosition.Max) + diameter; context.DrawLine(stroke, xStart, yCenter, xEnd, yCenter); foreach (var position in Definitions.AvatarCenterXEndPositions) { var xCenter = clientSize.Width * position; context.FillCircle(fill, xCenter, yCenter, radius); context.DrawCircle(stroke, xCenter, yCenter, radius); } }
protected override void BuildVertices() { var startTiming = StartNote.Temporary.HitTiming.TotalSeconds; var now = Now; var context = RenderContext; var xs = new float[JointCount]; var ys = new float[JointCount]; var rs = new float[JointCount]; var x2 = NotesLayerUtils.GetNoteXPosition(context, now, EndNote, true, true); var y2 = NotesLayerUtils.GetNoteYPosition(context, now, EndNote, true, true); var r2 = NotesLayerUtils.GetNoteRadius(now, EndNote); float x1, y1, r1; if (now <= startTiming) { x1 = NotesLayerUtils.GetNoteXPosition(context, now, StartNote, true, true); y1 = NotesLayerUtils.GetNoteYPosition(context, now, StartNote, true, true); r1 = NotesLayerUtils.GetNoteRadius(now, StartNote); } else { var startPosition = StartNote.Basic.FinishPosition; var endPosition = EndNote.Basic.FinishPosition; var tx1 = NotesLayerUtils.GetAvatarXPosition(context.Bounds, startPosition); var tx2 = NotesLayerUtils.GetAvatarXPosition(context.Bounds, endPosition); var endTiming = EndNote.Temporary.HitTiming.TotalSeconds; var tr = (float)(now - startTiming) / (float)(endTiming - startTiming); x1 = tx1 * (1 - tr) + tx2 * tr; y1 = NotesLayerUtils.GetAvatarYPosition(context.Bounds); r1 = Definitions.AvatarCircleRadius; } for (var i = 0; i < JointCount; ++i) { var t = (float)i / (JointCount - 1); xs[i] = MathHelper.Lerp(x1, x2, t); ys[i] = MathHelper.Lerp(y1, y2, t); rs[i] = MathHelper.Lerp(r1, r2, t); } var vertices = Vertices; for (var i = 0; i < JointCount; ++i) { var x = xs[i]; var y = ys[i]; var r = rs[i]; float ydif, xdif; if (i == JointCount - 1) { ydif = y - ys[i - 1]; xdif = x - xs[i - 1]; } else { ydif = ys[i + 1] - y; xdif = xs[i + 1] - x; } var rad = (float)Math.Atan2(ydif, xdif); var cos = (float)Math.Cos(rad); var sin = (float)Math.Sin(rad); var vertex1 = new Vector2(x - r * sin, y - r * cos); var vertex2 = new Vector2(x + r * sin, y + r * cos); vertices[i * 2] = vertex1; vertices[i * 2 + 1] = vertex2; } }