/// <summary> /// Called when it is time to render the next frame. Add your rendering code here. /// </summary> /// <param name="e">Contains timing information.</param> protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); _drawing.ProjectionMatrix = _projectionMatrix; _frameCount++; float yOffset = 0; if (_currentDemoPage != _previousPage) { _previousPage = _currentDemoPage; // we have to rebuild the stuff _drawing.DrawingPrimitives.Clear(); switch (_currentDemoPage) { case 0: { yOffset += _drawing.Print(_heading1, "ModernQuickFont", new Vector3((float)Width / 2, Height, 0), QFontAlignment.Centre, _heading1Options).Height; yOffset += _drawing.Print(_heading2, "Introduction #0", new Vector3(20, Height - yOffset, 0), QFontAlignment.Left, _heading2Options) .Height; yOffset += _drawing.Print(_mainText, _modernQuickFontIntro, new Vector3(30, Height - yOffset, 0), new SizeF(Width - 60f, -1), QFontAlignment.Left).Height; PrintCode(_modernIntroCode, ref yOffset); break; } case 1: { yOffset += _drawing.Print(_heading1, "QuickFont", new Vector3((float)Width / 2, Height, 0), QFontAlignment.Centre, _heading1Options).Height; yOffset += _drawing.Print(_heading2, "Introduction", new Vector3(20, Height - yOffset, 0), QFontAlignment.Left, _heading2Options) .Height; yOffset += 20f; _drawing.Print(_mainText, _introduction, new Vector3(30, Height - yOffset, 0), new SizeF(Width - 60f, -1), QFontAlignment.Justify); break; } case 2: { yOffset += _drawing.Print(_heading2, "Easy as ABC!", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, _heading2Options).Height; PrintComment(_usingQuickFontIsSuperEasy, ref yOffset); PrintCode(_loadingAFont1, ref yOffset); PrintComment(_andPrintWithIt, ref yOffset); PrintCode(_printWithFont1, ref yOffset); PrintComment(_itIsAlsoEasyToMeasure, ref yOffset); PrintCode(_measureText1, ref yOffset); PrintComment(oneOfTheFirstGotchas, ref yOffset); PrintCode(_loadingAFont2, ref yOffset); break; } case 3: { yOffset += _drawing.Print(_heading2, "Alignment", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, _heading2Options).Height; PrintCommentWithLine(_whenPrintingText, QFontAlignment.Left, 20f, ref yOffset); PrintCode(_printWithFont2, ref yOffset); PrintCommentWithLine(_righAlignedText, QFontAlignment.Right, 20f, ref yOffset); yOffset += 10f; PrintCommentWithLine(_centredTextAsYou, QFontAlignment.Centre, Width * 0.5f, ref yOffset); break; } case 4: { // in this stage force redraw and recreation of VBO every time: just divert last page _previousPage = -1; yOffset += _drawing.Print(_heading2, "Bounds and Justify", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, _heading2Options).Height; yOffset += 20; yOffset += _drawing.Print(_controlsText, "Press [Up], [Down] or [Enter]!", new Vector3(Width * 0.5f, Height - yOffset, 0f), QFontAlignment.Centre, _controlsTextOpts).Height; float boundShrink = (int)(350 * (1 - Math.Cos(_boundsAnimationCnt * Math.PI * 2))); yOffset += 15; PrintWithBounds(_mainText, _ofCourseItsNot, new RectangleF(30f + boundShrink * 0.5f, yOffset, Width - 60 - boundShrink, 350f), _cycleAlignment, ref yOffset); string printWithBounds = "myFont.Print(text, position, maxSize, QFontAlignment." + _cycleAlignment + ");"; yOffset += 15f; PrintCode(printWithBounds, ref yOffset); break; } case 5: { yOffset += _drawing.Print(_heading2, "Your own Texture Fonts", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, _heading2Options).Height; PrintComment(_anotherCoolFeature, ref yOffset); PrintCode(_textureFontCode1, ref yOffset); PrintComment(_thisWillHaveCreated, ref yOffset); break; } case 6: { yOffset += _drawing.Print(_heading2, "Your own Texture Fonts", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, _heading2Options).Height; PrintComment(_ifYouDoIntend, ref yOffset); PrintCode(_textureFontCode2, ref yOffset); PrintComment(_actuallyTexturing, ref yOffset); PrintCode(_textureFontCode3, ref yOffset); break; } case 7: { // in this stage force redraw and recreation of VBO every time: just divert last page _previousPage = -1; // store this primitive to remember QFontDrawingPrimitive dp = new QFontDrawingPrimitive(_heading2) { Options = { DropShadowActive = true, DropShadowOffset = new Vector2(0.1f + 0.2f * (float)Math.Sin(_cnt), 0.1f + 0.2f * (float)Math.Cos(_cnt)) } }; yOffset += dp.Print("Drop Shadows", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left).Height; _drawing.DrawingPrimitives.Add(dp); PrintComment(_asIhaveleant, ref yOffset); PrintCode(_dropShadowCode1, ref yOffset); PrintComment(_thisWorksFine, ref yOffset); PrintCode(_dropShadowCode2, ref yOffset); PrintComment(_onceAFont, ref yOffset); //mainText.Options.DropShadowActive = false; break; } case 8: { yOffset += _drawing.Print(_heading2, "Monospaced Fonts", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, _heading2Options).Height; QFontRenderOptions monoSpaceCondensed = _monoSpacedOptions.CreateClone(); monoSpaceCondensed.CharacterSpacing = 0.05f; PrintComment(_monoSpaced, _hereIsSomeMono, QFontAlignment.Left, ref yOffset, monoSpaceCondensed); PrintCode(_monoCode1, ref yOffset); PrintComment(_monoSpaced, _theDefaultMono, QFontAlignment.Left, ref yOffset, monoSpaceCondensed); PrintCommentWithLine(_monoSpaced, _mono, QFontAlignment.Left, 20f, ref yOffset, monoSpaceCondensed); yOffset += 2f; PrintCommentWithLine(_monoSpaced, _mono, QFontAlignment.Right, 20f, ref yOffset, monoSpaceCondensed); yOffset += 2f; PrintCommentWithLine(_monoSpaced, _mono, QFontAlignment.Centre, Width * 0.5f, ref yOffset, monoSpaceCondensed); yOffset += 2f; PrintComment(_monoSpaced, "As usual, you can adjust character spacing with myPrimitive.Options.CharacterSpacing.", QFontAlignment.Left, ref yOffset, monoSpaceCondensed); break; } case 9: { // in this stage force redraw and recreation of VBO every time: just divert last page _previousPage = -1; yOffset += _drawing.Print(_heading2, "Preprocessed Text", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left).Height; yOffset += 20f; _stopwatch = Stopwatch.StartNew(); yOffset += _drawing.Print(_mainText, _processedText, new Vector3(20, Height - yOffset, 0)).Height; _stopwatch.Stop(); long preprocessed = _stopwatch.Elapsed.Ticks; _stopwatch = Stopwatch.StartNew(); yOffset += _drawing.Print(_mainText, _nonPreProcessed, new Vector3(20, Height - yOffset, 0), new SizeF(Width - 40f, -1), QFontAlignment.Left) .Height; _stopwatch.Stop(); long notpreprocessed = _stopwatch.Elapsed.Ticks; if (_frameCount > 60) { _benchResult = string.Format(("{0} {1}\nPreprocessed was {2} ticks faster"), preprocessed, notpreprocessed, notpreprocessed - preprocessed); _frameCount = 0; } _drawing.Print(_benchmarkResults, _benchResult, new Vector3(Width * 0.5f, Height - yOffset, 0), QFontAlignment.Centre, Color.White); break; } case 10: { yOffset += _drawing.Print(_heading2, "In Conclusion", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, _heading2Options).Height; PrintComment(_thereAreActually, ref yOffset); break; } case 11: { yOffset += _drawing.Print(_heading2, "Different installed fonts", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, _heading2Options).Height + 20; foreach (var qFont in _installedFonts) { yOffset += _drawing.Print(qFont, "This text is printed with " + qFont.FontName, new Vector3(20f, Height - yOffset, 0), QFontAlignment.Left, Color.White).Height + 10; } break; } } _drawing.RefreshBuffers(); } // Create controlsDrawing every time.. would be also good to vary ProjectionMatrix with * Matrix4.CreateTranslation() ! // this would save buffer work for OpenGL _controlsDrawing.DrawingPrimitives.Clear(); _controlsDrawing.ProjectionMatrix = _projectionMatrix; if (_currentDemoPage != _lastPage) { var dim = _controlsText.Measure("Press [Right] ->"); Vector3 pos = new Vector3(Width - dim.Width / 2 - 16 * (float)(1 + Math.Sin(_cnt * 4)), _controlsText.Measure("P").Height + 10f, 0f); var dp = new QFontDrawingPrimitive(_controlsText, _controlsTextOpts); dp.ModelViewMatrix = Matrix4.CreateTranslation(0, dim.Height / 2, 0) * Matrix4.CreateRotationZ((float)MathHelper.DegreesToRadians(Math.Sin(_cnt * 4) * 15)) * Matrix4.CreateTranslation(pos); _controlsDrawing.DrawingPrimitives.Add(dp); dp.Print("Press [Right] ->", Vector3.Zero, QFontAlignment.Centre); } if (_currentDemoPage != 0) { var pos = new Vector3(10 + 16 * (float)(1 + Math.Sin(_cnt * 4)), _controlsText.Measure("P").Height + 10f, 0f); _controlsDrawing.Print(_controlsText, "<- Press [Left]", pos, QFontAlignment.Left, _controlsTextOpts); } _controlsDrawing.RefreshBuffers(); _controlsDrawing.Draw(); _drawing.Draw(); SwapBuffers(); }
static void OnRenderFrame() { GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); drawing.ProjectionMatrix = _projectionMatrix; frameCount++; float yOffset = 0; //mainText.Begin(); //GL.Begin(BeginMode.Quads); //GL.Color3(1.0f, 1.0f, 1.0); GL.Vertex2(0, 0); //GL.Color3(0.9f, 0.9f, 0.9f); GL.Vertex2(0, Height); //GL.Color3(0.9f, 0.9f, 0.9f); GL.Vertex2(Width, Height); //GL.Color3(0.9f, 0.9f, 0.9f); GL.Vertex2(Width, 0); //GL.End(); //mainText.End(); if (currentDemoPage != _previousPage) { _previousPage = currentDemoPage; // we have to rebuild the stuff drawing.DrawingPimitiveses.Clear(); switch (currentDemoPage) { case 0: { yOffset += drawing.Print(heading1, "ModernQuickFont", new Vector3((float)Width / 2, Height, 0), QFontAlignment.Centre, heading1Options).Height; yOffset += drawing.Print(heading2, "Introduction #0", new Vector3(20, Height - yOffset, 0), QFontAlignment.Left, heading2Options) .Height; yOffset += drawing.Print(mainText, modernQuickFontIntro, new Vector3(30, Height - yOffset, 0), new SizeF(Width - 60f, -1), QFontAlignment.Justify).Height; PrintCode(modernIntroCode, ref yOffset); break; } case 1: { yOffset += drawing.Print(heading1, "QuickFont", new Vector3((float)Width / 2, Height, 0), QFontAlignment.Centre, heading1Options).Height; yOffset += drawing.Print(heading2, "Introduction", new Vector3(20, Height - yOffset, 0), QFontAlignment.Left, heading2Options) .Height; yOffset += 20f; drawing.Print(mainText, introduction, new Vector3(30, Height - yOffset, 0), new SizeF(Width - 60f, -1), QFontAlignment.Justify); break; } case 2: { yOffset += drawing.Print(heading2, "Easy as ABC!", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, heading2Options).Height; PrintComment(usingQuickFontIsSuperEasy, ref yOffset); PrintCode(loadingAFont1, ref yOffset); PrintComment(andPrintWithIt, ref yOffset); PrintCode(printWithFont1, ref yOffset); PrintComment(itIsAlsoEasyToMeasure, ref yOffset); PrintCode(measureText1, ref yOffset); PrintComment(oneOfTheFirstGotchas, ref yOffset); PrintCode(loadingAFont2, ref yOffset); break; } case 3: { yOffset += drawing.Print(heading2, "Alignment", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, heading2Options).Height; PrintCommentWithLine(whenPrintingText, QFontAlignment.Left, 20f, ref yOffset); PrintCode(printWithFont2, ref yOffset); PrintCommentWithLine(righAlignedText, QFontAlignment.Right, 20f, ref yOffset); yOffset += 10f; PrintCommentWithLine(centredTextAsYou, QFontAlignment.Centre, Width * 0.5f, ref yOffset); break; } case 4: { // in this stage force redraw and recreation of VBO every time: just divert last page _previousPage = -1; yOffset += drawing.Print(heading2, "Bounds and Justify", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, heading2Options).Height; yOffset += 20; yOffset += drawing.Print(controlsText, "Press [Up], [Down] or [Enter]!", new Vector3(Width * 0.5f, Height - yOffset, 0f), QFontAlignment.Centre, controlsTextOpts).Height; float boundShrink = (int)(350 * (1 - Math.Cos(boundsAnimationCnt * Math.PI * 2))); yOffset += 15; PrintWithBounds(mainText, ofCourseItsNot, new RectangleF(30f + boundShrink * 0.5f, yOffset, Width - 60 - boundShrink, 350f), cycleAlignment, ref yOffset); string printWithBounds = "myFont.Print(text, position, maxSize, QFontAlignment." + cycleAlignment + ");"; yOffset += 15f; PrintCode(printWithBounds, ref yOffset); break; } case 5: { yOffset += drawing.Print(heading2, "Your own Texture Fonts", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, heading2Options).Height; PrintComment(anotherCoolFeature, ref yOffset); PrintCode(textureFontCode1, ref yOffset); PrintComment(thisWillHaveCreated, ref yOffset); break; } case 6: { yOffset += drawing.Print(heading2, "Your own Texture Fonts", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, heading2Options).Height; PrintComment(ifYouDoIntend, ref yOffset); PrintCode(textureFontCode2, ref yOffset); PrintComment(actuallyTexturing, ref yOffset); PrintCode(textureFontCode3, ref yOffset); break; } case 7: { // in this stage force redraw and recreation of VBO every time: just divert last page _previousPage = -1; // store this primitive to remember QFontDrawingPimitive dp = new QFontDrawingPimitive(heading2); dp.Options.DropShadowActive = true; dp.Options.DropShadowOffset = new Vector2(0.1f + 0.2f * (float)Math.Sin(cnt), 0.1f + 0.2f * (float)Math.Cos(cnt)); yOffset += dp.Print("Drop Shadows", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left).Height; drawing.DrawingPimitiveses.Add(dp); PrintComment(asIhaveleant, ref yOffset); PrintCode(dropShadowCode1, ref yOffset); PrintComment(thisWorksFine, ref yOffset); PrintCode(dropShadowCode2, ref yOffset); PrintComment(onceAFont, ref yOffset); //mainText.Options.DropShadowActive = false; break; } case 8: { yOffset += drawing.Print(heading2, "Monospaced Fonts", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, heading2Options).Height; QFontRenderOptions monoSpaceCondensed = monoSpacedOptions.CreateClone(); monoSpaceCondensed.CharacterSpacing = 0.05f; PrintComment(monoSpaced, hereIsSomeMono, QFontAlignment.Left, ref yOffset, monoSpaceCondensed); PrintCode(monoCode1, ref yOffset); PrintComment(monoSpaced, theDefaultMono, QFontAlignment.Left, ref yOffset, monoSpaceCondensed); PrintCommentWithLine(monoSpaced, mono, QFontAlignment.Left, 20f, ref yOffset, monoSpaceCondensed); yOffset += 2f; PrintCommentWithLine(monoSpaced, mono, QFontAlignment.Right, 20f, ref yOffset, monoSpaceCondensed); yOffset += 2f; PrintCommentWithLine(monoSpaced, mono, QFontAlignment.Centre, Width * 0.5f, ref yOffset, monoSpaceCondensed); yOffset += 2f; PrintComment(monoSpaced, "As usual, you can adjust character spacing with myPrimitive.Options.CharacterSpacing.", QFontAlignment.Left, ref yOffset, monoSpaceCondensed); break; } case 9: { // in this stage force redraw and recreation of VBO every time: just divert last page _previousPage = -1; yOffset += drawing.Print(heading2, "Preprocessed Text", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left).Height; yOffset += 20f; _stopwatch = Stopwatch.StartNew(); yOffset += drawing.Print(mainText, _processedText, new Vector3(20, Height - yOffset, 0)).Height; _stopwatch.Stop(); long preprocessed = _stopwatch.Elapsed.Ticks; _stopwatch = Stopwatch.StartNew(); yOffset += drawing.Print(mainText, nonPreProcessed, new Vector3(20, Height - yOffset, 0), new SizeF(Width - 40f, -1), QFontAlignment.Justify) .Height; _stopwatch.Stop(); long notpreprocessed = _stopwatch.Elapsed.Ticks; if (frameCount > 60) { _benchResult = string.Format(("{0} {1}\nPreprocessed was {2} ticks faster"), preprocessed, notpreprocessed, notpreprocessed - preprocessed); frameCount = 0; } drawing.Print(_benchmarkResults, _benchResult, new Vector3(Width * 0.5f, Height - yOffset, 0), QFontAlignment.Centre, Color.White); break; } case 10: { yOffset += drawing.Print(heading2, "In Conclusion", new Vector3(20f, Height - yOffset, 0f), QFontAlignment.Left, heading2Options).Height; PrintComment(thereAreActually, ref yOffset); break; } } drawing.RefreshBuffers(); } // Create controlsDrawing every time.. would be also good to vary ProjectionMatrix with * Matrix4.CreateTranslation() ! // this would save buffer work for OpenGL controlsDrawing.DrawingPimitiveses.Clear(); controlsDrawing.ProjectionMatrix = _projectionMatrix; if (currentDemoPage != lastPage) { Vector3 pos = new Vector3(Width - 10 - 16 * (float)(1 + Math.Sin(cnt * 4)), controlsText.Measure("P").Height + 10f, 0f); controlsDrawing.Print(controlsText, "Press [Right] ->", pos, QFontAlignment.Right, controlsTextOpts); } if (currentDemoPage != 0) { var pos = new Vector3(10 + 16 * (float)(1 + Math.Sin(cnt * 4)), controlsText.Measure("P").Height + 10f, 0f); controlsDrawing.Print(controlsText, "<- Press [Left]", pos, QFontAlignment.Left, controlsTextOpts); } controlsDrawing.RefreshBuffers(); controlsDrawing.Draw(); drawing.Draw(); //GL.Disable(EnableCap.Blend); }