SharpDX.SimpleInitializer, an easy way of initializing SharpDX in your XAML projects

After working on some Windows Phone apps that required the usage of a DrawingSurface/DrawingSurfaceBackgroundGrid to perform Direct3D drawing, I have isolated some of the code in a standalone library for easily initialization of the Direct3D device, context and associated resources.

The library abstracts the initialization of Direct3D and transparently handles such cases as the control being resized (for example, a Windows Store application being snapped) and the device being lost or recreated (Windows Phone does this when sending the application to the foreground). The only dependency comes from SharpDX and it can be used in Windows Phone 8, Windows Phone 8.1 Silverlight, Windows Store 8.1 and Universal projects.

This is the workflow you should follow when using it:

  • When navigating to a page where the Direct3D drawing will be performed, instantiate a SharpDXContext object.
  • Subscribe to its DeviceReset and Render events to perform resource loading and drawing, respectively.
  • Call BindToControl passing the existing DrawingSurface, DrawingSurfaceBackgroundGrid, SwapChainPanel or SwapChainBackgroundPanel control.
  • The event Render will be raised whenever the control asks for a new frame, perform your drawing there using the D3DDevice and D3DContext properties.
  • When navigating away from the page, unsubscribe from the events and Dispose the SharpDXContext object.

You can download the library from NuGet, or take a look at the code on GitHub. Some sample projects that show how to properly manage the lifetime of the SharpDXContext object are available here.

Extension methods for switching BinaryReader/BinaryWriter endianness

Although very simple, I have published a new small portable class library that adds some extension methods to the BinaryReader and BinaryWriter classes. It consists of overloads to the Read* and Write methods to allow switching the endianness of the data being readen/written. Since almost all current .NET CLR platforms run on little endian (Windows Phone does too, thanks to the ability of ARM to switch between big and little endian), these functions are helpful when reading data exported from other platforms, or more commonly, JPEG files.

The library is available for download from GitHub, both in source code and compiled form. Or if you prefer, you can search for the BinaryEndiannessExtensions package on NuGet and add it directly to your project.

When being organized in Unity 3D is dangerous

While adding Prime31’s Android In-App Billing to an existing game I came across a weird behavior: the calls to the native plugin (made through the GoogleIAB class) were being registered but the callback events (the ones defined in GoogleIABManager) weren’t firing.

After half a day of looking at Android’s documentation, browsing the existing knowledge base and trying different things I found the problem: in a previous refactor I had modified the source files provided by the plugin to put the classes inside a custom namespace. Apparently the reflection methods internally used by the plugin don’t like this and it failed silently. No indication that the type couldn’t be found, failed instancing or the methods didn’t exist.

Morale of this story is to never modify the source code of existing Unity 3D plugins as they usually are quite weak and can break, so whenever you install something from the Asset Store make sure you don’t modify it. In case someone ever has the same problem I added it to the official knowledge base.