Well, I have been working really hard on this from the beginning of September, and I explained why in my previous post about Direct3D 11. I have checked-in lots of code under the v2 branch on SlimDX, while having lots of discussion with the team (mostly Josh which is mostly responsible for v2) on their devel mailing list. The reason I'm leaving SlimDX team is that It was in fact not clear for me that I was not enrolled as part of the decision for the v2 directions, although I was bringing a whole solution (by "whole", I mean a large proof of concept, not something robust, finished). At some point, Josh told me that Promit, Mike and himself, co-founders of SlimDX, were the technical leaders of this project and they would have the last word on the direction as well as for decisions on the v2 API.
Unfortunately, I was not expecting to work in such terms with them, considering that I had already made 100% of the whole engineering prototype for the next API. From the last few days, we had lots of -small- technical discussions, but for some of them, I clearly didn't agree about the decisions that were taken, whatever the arguments I was trying to give to them. This is a bit of disappointment for me, but well, that's life of open source projects. This is their project and they have other plans for it. So, I have decided to release the project on my own with SharpDX although you will see that the code is also currently exactly the same on the v2 branch of SlimDX (of course, because until yesterday, I was working on the SlimDX v2 branch).
But things are going to change for both projects : SlimDX is taking the robust way (for which I agree) but with some decisions that I don't agree (in terms of implementation and direction). Although, as It may sound weird, SharpDX is not intended to compete with SlimDX v2 : They have clearly a different scope (supporting for example Direct3D 9, which I don't really care in fact), different target and also different view on exposing the API and a large existing community already on SlimDX. So SharpDX is primarily intended for my own work on demomaking. Nothing more. I'm releasing it, because SlimDX v2 is not going to be available soon, even for an alpha version. On my side, I'm considering that the current state (although far to be as clean as It should be) of the SharpDX API is usable and I'm going to use it on my own, while improving the generator and parser, to make the code safer and more robust.
So, I did lots of work to bring new API into this system, including :
- Direct3D 10
- Direct3D 10.1
- Direct3D 11
- Direct2D 1
- DirectWrite
- DXGI
- DXGI 1.1
- D3DCompiler
- DirectSound
- XAudio2
- XAPO
using System;
using System.Drawing;
using SharpDX.Direct2D1;
using SharpDX.Samples;
namespace TessellateApp
{
/// <summary>
/// Direct2D1 Tessellate Demo.
/// </summary>
public class Program : Direct2D1DemoApp, TessellationSink
{
EllipseGeometry Ellipse { get; set; }
PathGeometry TesselatedGeometry{ get; set; }
GeometrySink GeometrySink { get; set; }
protected override void Initialize(DemoConfiguration demoConfiguration)
{
base.Initialize(demoConfiguration);
// Create an ellipse
Ellipse = new EllipseGeometry(Factory2D,
new Ellipse(new PointF(demoConfiguration.Width/2, demoConfiguration.Height/2), demoConfiguration.Width/2 - 100,
demoConfiguration.Height/2 - 100));
// Populate a PathGeometry from Ellipse tessellation
TesselatedGeometry = new PathGeometry(Factory2D);
GeometrySink = TesselatedGeometry.Open();
// Force RoundLineJoin otherwise the tesselated looks buggy at line joins
GeometrySink.SetSegmentFlags(PathSegment.ForceRoundLineJoin);
// Tesselate the ellipse to our TessellationSink
Ellipse.Tessellate(1, this);
// Close the GeometrySink
GeometrySink.Close();
}
protected override void Draw(DemoTime time)
{
base.Draw(time);
// Draw the TextLayout
RenderTarget2D.DrawGeometry(TesselatedGeometry, SceneColorBrush, 1, null);
}
void TessellationSink.AddTriangles(Triangle[] triangles)
{
// Add Tessellated triangles to the opened GeometrySink
foreach (var triangle in triangles)
{
GeometrySink.BeginFigure(triangle.Point1, FigureBegin.Filled);
GeometrySink.AddLine(triangle.Point2);
GeometrySink.AddLine(triangle.Point3);
GeometrySink.EndFigure(FigureEnd.Closed);
}
}
void TessellationSink.Close()
{
}
[STAThread]
static void Main(string[] args)
{
Program program = new Program();
program.Run(new DemoConfiguration("SharpDX Direct2D1 Tessellate Demo"));
}
}
}
This simple example is producing the following ouput :
which is pretty cool, considering the amount of code (although the Direct3D 10 and D2D initialization part would give a larger code), I found this to be much simpler than the gluTessellation API.
You will find also some other samples, like the XAudio2 ones, generating a synthesized sound with the usage of the reverb, and even some custom XAPO sound processors!
You can grab those samples on SharpDX code repository (there is a SharpDXBinAndSamples.zip with a working solutions with all the samples I have been developing so far, with also MiniTris sample from SlimDX).