Along with a couple game projects, I have various pieces of tooling and libraries that I’m working on. Today I’m sharing LilyPath, a drawing library for MonoGame and XNA.


LilyPath provides some of the functionality found in System.Drawing, such as drawing paths and shapes with configurable pens and brushes. Instead of creating raster image however, LilyPath renders everything directly to your scene. Complex paths and filled shapes are rendered as polygons, while primitives are rendered as GL or DX lines.

Drawing is handled through a DrawBatch object to reduce the number of draw calls needed, mirroring the role of SpriteBatch for rendering textured quads. More complex geometry can be compiled ahead of time into GraphicsPath objects, which contain the polygon data after arcs, joins, and other calculations have been completed.

Here’s a short code sample for drawing the lily pad in the picture above (without the flower):


Vector2 origin = new Vector2(200, 200);
float startAngle = (float)(Math.PI / 16) * 25; // 11:20
float arcLength = (float)(Math.PI / 16) * 30;

drawBatch.FillCircle(new SolidColorBrush(Color.SkyBlue), origin, 175);
drawBatch.FillArc(new SolidColorBrush(Color.LimeGreen), origin, 150, 
    startAngle, arcLength, ArcType.Sector);
drawBatch.DrawClosedArc(new Pen(Color.Green, 15), origin, 150, 
    startAngle, arcLength, ArcType.Sector);


Source code for the full image and other examples can be found in the included test project, LilyPathDemo.

I’m currently using LilyPath in a game project for procedural terrain generation, and in a level editor for general annotation support. If you find an interesting use for this library, let me know in the comments.

About jaquadro

I am a full time software developer and part time game and game tooling developer.
This entry was posted in Programming, Software and tagged , , , . Bookmark the permalink.

8 Responses to LilyPath

  1. Oleg says:

    Are you planning to add support for cubic and quadratic bezier curves?

    • jaquadro says:

      It’s not a feature that I need right now, but it’s something I’ll probably want in the future when I’m working on path support for my editor.

      The good news is that if you can find code to turn bezier control points into discrete points, you can draw those as paths. I’ve used other external code with LilyPath, such as Clipper, to do union or intersection joins on polygons that I want to fill or outline.

    • jaquadro says:

      Contrary to my previous reply, I decided to go ahead and add this anyway.

      Quadratic and cubic Bezier support has now been added in the most recent checkin.

  2. Very cool. I’ve been using a similar thing in my level editor but I haven’t focused a whole lot of energy into it so yours is probably better. I’ll keep an eye on it.

  3. Nhat says:

    Can you help me, how to use it?
    I try add them into my XNA project but it don’t work.

  4. Hardwood furnishings possesses one thing very natural about it.
    There is this feeling of comfort, of attribute as well as of style that can be actually
    be found in hardwood household furniture. Wood is born coming from the planet.

Leave a Reply

Your email address will not be published. Required fields are marked *