v2019.03 Released


  • Ultraviolet's core timing logic can now be overridden if you want more control over your application's main loop.
    • A virtual method called CreateTimingLogic() has been added to the following classes:
      • UltravioletApplication
      • UltravioletActivity
      • UltravioletForm
    • Return a new instance of the IUltravioletTimingLogic interface from that method in order to control the timing of your Draw() and Update() calls. The UltravioletTimingLogic class is the default implementation of this interface which is used if CreateTimingLogic() is not overridden.

v2019.01 Released


  • FIX: Dependency property inheritance is now correctly implemented.
  • The TextElement.Font, TextElement.FontStyle, TextElement.Foreground, and TextElement.Background attached properties are now inherited.
  • The TextOptions.TextRenderingMode, TextOptions.TextScript, and TextOptions.TextLanguage attached properties are now inherited.
  • The FlowDirection dependency property is now inherited.

v2018.12 Released


  • There are now Xamarin.Mac Modern versions of all Ultraviolet assemblies, as well as corresponding NuGet packages. A new compatibility shim, Ultraviolet.Shims.macOSModern, has also been provided for this use case.


  • Fixed a bug causing a crash on .NET Core 3.0 Preview.
  • The VertexFormat enumeration has been renamed to VertexElementFormat.
  • The VertexUsage enumeration has been renamed to VertexElementUsage.
  • Added the Name property to VertexElement. This property can be set using an optional parameter in the constructor. If specified, it will override the default name used for the vertex element in shaders.
  • Numerous fixes and improvements to text rendering.


  • The TextEditor control now supports text shaping via the TextOptions.TextRenderingMode attached property.

v2018.10 Released


  • Added bidirectional implicit conversion operators between Vector2, Vector3, Vector4, Quaternion, Matrix, and their equivalent types from the System.Numerics.Vectors package.


  • Added a new NuGet package, Ultraviolet.ImGuiViewProvider. This package, intended as a simpler alternative to Ultraviolet.Presentation, allows an Ultraviolet application to use the immediate-mode Dear ImGui library for constructing user interfaces.


  • FIX: The SetData() methods on IndexBuffer and VertexBuffer now correctly support all valid types.
  • FIX: Fix for caching behavior in OpenGL effect parameters when using array types.
  • Made changes to the TextShaper API:
    • Removed GuessUnicodeProperties() method.
    • Removed Length property.
    • Added SetUnicodeProperties() method.
    • Added GetUnicodeProperties() method.
    • Added RawLength property.
  • Added SourceIndex property to ShapedChar structure.
  • Added SetRawData() method to Texture2D, Texture3D, VertexBuffer, IndexBuffer, and Surface2D classes.

v2018.07 Released


  • FIX: Added support for matrix array uniform values (thanks stefnotch!)
  • Added support for rendering complex scripts which require text shaping, such as Arabic.
  • Added support for rendering right-to-left text.
  • Updated the text layout engine to support right-to-left layout.


  • Added the TextIsShaped, TextScript, TextDirection, and TextLanguage attached properties to provide support for complex scripts and right-to-left layout on most controls.
    • Text editing controls do not currently support these properties.

v2018.05 Released


  • Added setters to the Location and Size properties of the Rectangle, RectangleF, and RectangleD structures (thanks Scellow).


  • Windows are now hidden until the first frame is about to be rendered, preventing the user from seeing an unpainted window (thanks Scellow).
    • This behavior can be overridden by setting the WindowIsShownImmediately property when configuring the Ultraviolet context.


  • Added the uvassetlist command line utility for generating asset lists.
  • Added support for pregenerated asset lists to improve loading times.
    • Add the list to the root of your project as an embedded resource in order to make use of this feature.


  • FIX: Fixed a crash when attempting to use glTextureStorage2D() on some configurations.
  • By default, Ultraviolet will now use the latest version of OpenGL on desktop platforms.
  • Added the Invalidate() method to RenderTarget2D.
  • Added the VertexPositionNormalTexture structure (thanks Scellow).

v2018.04 Released


  • FIX: Fixed a crash when attempting to run on Android the Release configuration.


  • Implemented a plugin architecture using the UltravioletPlugin abstract class.


NOTE: The Create() methods on RenderBuffer2D have been moved into Texture2D and renamed.
NOTE: The Create() methods in Texture2D and Texture3D have been renamed.

  • FIX: Fixed a crash when attempting to run under OpenGL ES 2.0.
  • Created a new library, Ultraviolet.FreeType2. This library implents a plugin which allows Ultraviolet to render OpenType and TrueType fonts, including fonts with CJK and other non-Latin character sets.
    • The Ultraviolet.FreeType2 library is now available as a NuGet package.
    • See this wiki article for details.
  • Updated the text layout engine to better support FreeType2 fonts.
  • Updated the text layout engine to support UTF-16 surrogate pairs.
  • Updated the text layout engine to support fallback fonts. If the current font does not contain a glyph which is being rendered, the engine will search for a registered fallback font which contains it and use that instead.
    • Fallback fonts can be registered with the RegisterFallbackFont() method on TextRenderer.
  • Added support for the SRGB color space. It is highly recommended that you enable this if you're using FreeType2 fonts; they won't render properly without proper gamma correction.

v2018.03 Released

Version 2018.03 of the Ultraviolet Framework has been released and the binaries are now available on NuGet.



  • Upgraded to JSON.NET 11.


  • Implemented DynamicTextureAtlas. Unlike the existing TextureAtlas class, dynamic atlases can be constructed at runtime. The packing algorithm used by dynamic atlases will waste space if the individual textures are not uniformly sized, but it is substantially faster.
  • Implemented DynamicTexture2D and DynamicTexture3D. These textures have a callback which is invoked immediately before they are bound to the device for rendering, allowing them to be lazily updated.


  • Removed a number of redundant error checks across the Framework.

v2018.02 Released

Version 2018.02 of the Ultraviolet Framework has been released and the binaries are now available on NuGet.



  • A new implementation of the Audio subsystem, built on FMOD, is now available for use.
    • BASS remains the default implementation.
    • The SelectAudioImplementation() method has been added to UltravioletConfiguration so that you can easily choose which implementation you want to use.
    • The FMOD and BASS implementations are (read: should be) functionally identical, but the underlying libraries have different licenses. Choose an implementation based on which license you prefer.
  • Added the EnumerateAudioDevices() method to IUltravioletAudio.
  • Added the PlaybackDevice property to IUltravioletAudio.
  • The selected playback device is now saved as part of the Ultraviolet audio settings.


  • In content manifests, you can now specify a generic type in the form SomeType{ArgType1, ArgType2}. For example, you can refer to a generic list of string as System.Collections.Generic.List{System.String}.
  • On Android, the new UsePlatformSpecificFileSource() method will allow Android assets to be used as Ultraviolet's file source.


  • FIX: Adjusted output of Roslyn compiler for better compatibility with Xamarin mobile platforms.

v2018.01 Released

Version 2018.01 of the Ultraviolet Framework has been released and the binaries are now available on NuGet.



  • Upgraded to .NET Framework 4.7.
  • Upgraded to SDL2 2.0.7.
  • Added projects for .NET Standard 2.0.
  • Added projects for .NET Core 2.0.

NOTE: Running Ultraviolet on .NET Core should still be considered highly experimental. CoreCLR is an entirely new runtime that is still very much in development; accordingly, some of Ultraviolet's features aren't fully implemented and others may contain bugs. Expect further changes when .NET Core SDK 2.1 is released.


  • Implemented a new dynamic library loader, Ultraviolet.Core.Native.LibraryLoader, which eliminates the need for DllMaps and should make loading native libraries easier and more consistent across platforms.
    • Not yet supported on Android or iOS.


  • The SDL2 implementation of the Input subsystem will now automatically attempt to load game controller mappings, if they are available.
    • The subsystem attempts to load a file called gamecontrollerdb.txt from the game's root directory.
    • A community-maintained database can be found here.


  • FIX: Ultraviolet GLSL directives (#ifver, #include, #includeres, etc.) will no longer be parsed if they are inside of multi-line comments.
  • An instance of Effect can now be created by directly loading either a .frag or a .vert file. The content processor will automatically load the corresponding vertex or fragment shader, so long as both shader files have the same name. For example, if you load foo.vert, the resulting program will be comprised of foo.vert and foo.frag.
  • Added the #param GLSL directive, with syntax #param "uniform_name". When this directive appears in a shader file, it indicates to Ultraviolet that an effect parameter needs to be created for the specified shader uniform. If the uniform cannot be located at runtime, Ultraviolet will throw an exception indicating that it was optimized out.


  • The UPF binding expressions compiler has been rewritten to make use of the Microsoft.CodeAnalysis.CSharp package (also known as Roslyn), bringing support for the latest C# language features.
  • A .NET Standard 2.0 version of the Ultraviolet.Presentation.Compiler library is now available.