public override void Render(CoreSdk.RenderingContext context) { // Start with line height equal to 100% of viewport height and // shrink to 10%. var startHeight = context.Viewport.Height; var endHeight = context.Viewport.Height * 0.1; // Get time relative to animation start. var animTime = TimeSpan.FromSeconds( this.simTime.TotalSeconds % this.animDuration.TotalSeconds); using (context.Renderer.SetRenderingMode(CoreSdk.RenderingMode.Default2d)) { foreach (var m in this.messages) { if (animTime < m.StartTime || animTime > m.EndTime) { continue; // This message should not be displayed now. } // Get time relative to message's time window. var messageAnimTime = animTime - m.StartTime; // Normalize to [0..1]. var messageAnimTimeNorm = messageAnimTime.TotalSeconds / m.Duration.TotalSeconds; var desiredHeight = Lerp(startHeight, endHeight, messageAnimTimeNorm); var scale = (float)GetScaleForDesiredSize( size: this.fontFace.GetHeight(), desiredSize: desiredHeight); // Center message in viewport. var textDim = context.Renderer.GetTextDimension(this.fontFace, m.Text, scale); var position = new CoreSdk.Vec2f( x: (context.Viewport.Width - textDim.X) / 2, y: (context.Viewport.Height - textDim.Y) / 2); // Red text fading out gradually. var opaqueness = (float)Lerp(1, 0, messageAnimTimeNorm); var color = new CoreSdk.Vec4f( m.Color.R / 255f, m.Color.G / 255f, m.Color.B / 255f, opaqueness); context.Renderer.Draw(this.fontFace, color, position, m.Text, scale); } } }
// Core will call this when a frame is being rendered. public override void Render(CoreSdk.RenderingContext context) { var text = string.Format( "Project: {0}\n" + "Path: {1}\n" + "Uptime (sys): {2:g}\n" + "Uptime (sim): {3:g}", ProjectName, ProjectFileName, DateTime.UtcNow - this.runningSince, this.simDuration); // Scale 300 will preserve our desired font line height // (here 32 screen pixels). const float scale = 300; // Bottom-left corner is (0, 0). var position = new CoreSdk.Vec2f( x: 10, y: context.Viewport.Height - 32); // Leaving space for 32 pixel line height. var shadowPosition = new CoreSdk.Vec2f( position.X + 2, position.Y - 2); // White opaque text with black opaque shadow. var color = new CoreSdk.Vec4f(1, 1, 1, 1); var shadowColor = new CoreSdk.Vec4f(0, 0, 0, 1); // We should restore rendering mode when we're done. Easiest way // is to wrap it in "using". using (context.Renderer.SetRenderingMode(CoreSdk.RenderingMode.Default2d)) { context.Renderer.Draw(this.fontFace, shadowColor, shadowPosition, text, scale); context.Renderer.Draw(this.fontFace, color, position, text, scale); } }