Mogre 1.7.3

Logo of the Ogre 3D Engine

Ogre 3D Logo

My last contact with Ogre 3D had been in 2008, when I had created an experimental x64 build (back then, OpenJPEG, FreeImage and some other dependencies didn’t yet build in x64 by default).

This worked out fine, but I didn’t find the time to actually do anything with Ogre. Finally, during the past weekend, I took a closer look at Mogre, a C++/CLI-based wrapper that enables you to use Ogre in .NET languages.

Continue Reading →

Nuclex Framework R1404 Released!

Logo of the Nuclex Framework, the text "Nuclex" with three green dots on a blue ring

The word 'Nuclex' in a stylish font framed by an elliptical ring with three dots

A few hours ago, I uploaded a new release of the Nuclex Framework to CodePlex. There has been an intermediate release, R1323, which I didn’t announce here because it was more or less just a stop-gap measure to stop reports for issues in the old (old, old) R1242 release where my Nuclex.Input library was still subclassing XNA’s Window.

This is what changed from R1242 to R1404:

  • Thanks to a generous contribution by Adrian Tsai, the TrueType importer now accepts standard Windows font names – this is a big step towards being a drop-in replacement for XNA’s own sprite font importer.
  • The TrueType importer now lets users choose different hinting algorithms. No hinting will result in MacOSish blurred text that stays true to the font’s metrics. The auto hinter from FreeType is a nice compromise between forcing strokes into a pixel raster for sharpness and retaining the font’s look (and imho the best option). Native will produce a perfect match with Windows’ font rendering, producing sharp letters that may deviate from the font’s actual metrics a bit.
  • You can now decide whether SpriteFonts imported by the TrueType importer are centered on their baseline or on their upper end (like XNA). This, together with the improved font name lookup turns the Nuclex TrueType importer into a 100% drop-in replacement for XNA’s font processor.
  • Nuclex.Input’s game pads now provide a method .GetExtendedState() with which you can access all of DirectInput’s 128 possible buttons, 24 axes and 8 sliders. I designed this so that there’s zero overhead if you don’t use the .GetExtendedState() method. The ExtendedGamePadState already normalizes axes for you (from -1.0 to +1.0 for axes and 0.0 to 1.0 for sliders) and in general is much nicer to work with than using DirectInput directly!
  • Nuclex.Input now supports TouchPanel input. That includes mocking TouchPanel input: You can easily simulate the TouchPanel in your unit tests:
    var m = new MockInputManager();
    m.GetTouchPanel().Press(42, 10.0f, 10.0f);
    m.GetTouchPanel().Move(42, 20.0f, 10.0f);
    m.GetTouchPanel().Release(42);
  • The GUI is now based on the Nuclex.Input library. That will allow me to soon implement TouchPanel input and make the GUI usable on Windows Phone 7. Note that you can easily hack Windows Phone 7 support into a project by converting touch input into mouse input. Due to the modular design of Nuclex.Input, you don’t have to touch a single line of code, simple create your own IInputCapturer!
  • The game state manager has undergone a redesign. Existing projects shouldn’t be in trouble, the redesign gets rid of the GameStateManager reference (you can remember the Reference yourself if you want your states to initiate a transition themselves). Pop-up game states similar to XNA’s game state management example are now supported.
  • Upgraded to NMock 3.0. This is mostly an internal change but it really helps being refactoring-friendly as my unit tests no longer contain method names hardcoded in strings anymore.
  • All assemblies in the Nuclex Framework are now signed with a strong name, this no longer preventing you from signing your own assemblies.
  • And of course, all issues that were reporting through various channels have been fixed — excluding two possible problems I can’t yet reproduce, but will mention here for honesty: the AffineThreadPool might sometimes be skipping a task under heavy load and there might be a problem in the PrimitiveBatch when it is handed large amounts of vertices. I couldn’t reproduce these issues and they’re not occurring in my own game, but if anyone notices such an issue, please contact me!

XNA Sprite Font Quality

Comparison of SpriteFont rendering quality

Screenshot of fonts in XNA 3.1, XNA 4.0 and the Nuclex font processor There has been a discussion on the XNA forums regarding a slight decrease in the visual quality of SpriteFonts from XNA 3.1 to XNA 4.0: XNA 4.0 renders SpriteFont differently (and not for the better).

There are two changes that might have impacted visual quality: XNA 4.0 uses premultiplied alpha everywhere (whereas XNA 3.1 processed the alpha channel as-is) and, as revealed by "Krome Studios", The FontDescriptionProcessor in XNA 4.0 generates a texture with DXT3 (a form of compression that limits each block of 4×4 pixels to contain only 4 different colors and reduces the alpha channel to 4 bits of precision or 16 levels, see Wikipedia).

Because I’ve written a custom FontDescriptionProcessor for XNA 4.0 which outputs compatible SpriteFonts but uses FreeType instead of Windows’ GDI font API, I decided to do a little comparison.

Continue Reading →

DynamicVertexBuffer versus DrawUserPrimitives, Round 2

Chart showing the PrimitiveBatch benchmark results in XNA 4.0, clipped to 500 FPS

More than a year ago, I did some benchmarking in XNA 3.1, comparing the vertex throughput I could achieve on my GeForce 8800 via XNA’s DynamicVertexBuffer class versus just calling GraphicsDevice.DrawUserPrimitives(). Here’s my earlier benchmark: Efficiently Rendering Dynamic Vertices.

In all cases, DrawUserPrimitives() was marginally faster than the DynmicVertexBuffer, but it appeared to be a very bad idea to use a DynamicVertexBuffer on the Xbox 360. I had a really nice discussion with Shawn Hargreaves on the XNA forums where he provided a lot of in-depth information about how things work on the Xbox 360: .

One of today’s threads on the AppHub forums reminded me if my earlier benchmarks, so I decided to dig out my old benchmark and redo it in XNA 4.0. The benchmark uses my Nuclex Framework‘s PrimitiveBatch class, which underwent some changes since then, so I repeated the XNA 3.1 benchmarks in addition to getting the new data for XNA 4.0.

Continue Reading →

New Toys

I just love listening to music in bed, right before going to sleep. You can close your eyes and focus, experiencing the music like a movie and less like the background noise music is often degraded to during the day. After moving my home office to a different floor, however, my bedroom is no longer close enough to my PC to do this (I used a rather quirky solution, using a game pad to remote-control WinAmp and later shut down my PC :D).

This put me on a quest for a replacement. Because I ripped my entire CD library as FLAC and stored it on my home server (running Gentoo Linux and serving the music files as a network share via Samba), I was looking for a player that supported FLAC and, ideally, would play music from a standard network share. This is what I ultimately decided on:

Logitech Squeezebox, a black rectangular box with speakers on both sides and a green display in the middle

That’s a Logitech Squeezebox Boom.

I admit that I half expected this category of devices to not exist at all, because a “normal” person doesn’t have a home server or a PC that’s always on. And when I found something I expected some half baked showpiece hardware, but was yet again positively surprised. Read on for my personal review of this brilliant device!

Continue Reading →

Nuclex Framework R1242 Released!

Logo of the Nuclex Framework, the text "Nuclex" with three green dots on a blue ring

The word 'Nuclex' in a stylish font framed by an elliptical ring with three dots

There’s a new release of the Nuclex Framework available on CodePlex!

The new release adds a new library, Nuclex.Input, which is a very lightweight library that adds seamless support for DirectInput game pads and joysticks, well-behaving keyboard text input, event-based input and the ability to mock any kind of input in your unit tests. Instead of firing up your XBox 360 each time, you can now write simple tests that simulate controllers being attached and detached.

Also new is full support for XNA 4.0 on x86 and XBox 360. Windows Phone 7 is also supported by most of the libraries. The PC builds all target the .NET Client Profile, allowing you to reduce the footprint of your installer. Special .NET 4.0 client profile builds of the third-party libraries (LZMA, NUnit, NMock, log4net and SlimDX).

Of course, all bugs reported since the last release have been fixed!

Code Better: Reference Containers for Change-Resistant Constructors

Proponents of dependency injection try to design classes so they can either work autonomously or get all services they rely on handed to them through their constructor. But even without dependency injection, the situation often arises where certain classes need to interact with a lot of other objects.

In these cases, you often end up with very complicated constructors and a lot of duplicate code:

public class RadarBuildingRenderer {
  public RadarBuildingRenderer(
    ISceneGraph sceneGraph,
    IContentManager contentManager,
    IAudioManager audioManager,
    RadarBuilding building
  ) {
    this.sceneGraph = sceneGraph;
    this.contentManager = contentManager;
    this.audioManager = audioManager;
    this.building = building;
  }
 
  private ISceneGraph sceneGraph;
  private IContentManager contentManager;
  private IAudioManager audioManager;
  private RadarBuilding building;
}

Above class takes care of rendering the visual and audible representations of a RadarBuilding in a computer game. As you can imagine, the same references will be required by other buildings, think TankFactoryBuilding, CommandCenterBuilding and so on – all duplicating the fields, their assignment and the complex constructor.

Continue Reading →

Code Better: Booleans instead of Comments

There are lots of small tricks a programmer learns over time. With this post, I’m starting a little column called Code Better in which I’ll share some of my own tricks! If you want to show off some useful tricks of your own, I’d be happy to publish them here, too 🙂

The first trick is a simple technique to make complicated if statements more readable. Let’s take a look at this beast:

// Only access the height field if the position is within
if(
  (x >= 0) && (y >= 0) &&
  (x < this.heightField.Width) &&
  (y < this.heightField.Length)
) {
  return this.heightField[x, y];
} else { // Position is outside the height field
  return 0.0f;
}

The code isn’t unreadable per se, but it takes more than a glance to understand what’s going on. The comments help, but there’s a more elegant way that makes those comments entirely redundant:

bool isInsideHeightField =
  (x >= 0) &&
  (y >= 0) &&
  (x < this.heightField.Width) &&
  (y < this.heightField.Length);
 
if(isInsideHeightField) {
  return this.heightField[x, y];
} else {
  return 0.0f;
}

The beauty in this is that the first thing you see is bool isInsideHeightField, prominently positioned at one indent less than the conditions. Your brain registers the purpose of that block of code before it encounters the actual code.

The if below is also much more obvious. If the position is inside the height field, look up the value in the height field, otherwise return zero. Almost like reading english.

Finally, this level of obviousness eliminates the need for any additional comments in the code!

MVC in Games

In the game I’m currently working on, it appears that I’m slowly drifting towards a design that’s a close resemblance of the Model-View-Controller (MVC) pattern, despite originally rejecting the idea because I believed it would require my game world to expose too much of its internal data just so the view could keep track of things.

Because I originally believed to be building a very simple game with very simple logic, I chose a design that would create a nice, non-fractured interface to the world so I would have an easier time building the AI and player controls on top of it:

UML diagram showing an object tree representing the entire game state

In this design, everything could access everything else – a monolithic world component where the public interface was well encapsulated, but that allowed the implementation to take the most direct path possible.

"Everything could access everything else" doesn’t mean my objects directly modified each other’s state, but it meant, for example, that a building had a reference to the island it was placed on and that it could call an internal method in the Island class to inform it when the building was destroyed or moved.

A full design, in contrast, would give the buildings an interface through which they determined properties about the ground (is it too rough? underwater?) and some events so its owner would know when the building was destroyed.

If I had only taken game logic into account, this all would have worked out very well. But there were some things that added a lot of complexity…

Continue Reading →

Input Mocking in XNA

I have updated my input library to a level where I think I can release it into the Nuclex Framework now. The design was tailored to make the input manager mockable (replaceable with a dummy object for unit testing), but the effort of mocking the entire input manager (versus just one input device) on an ad hoc basis was a bit too high (or too unreadable when using a dynamic mock object library).

So the final revision has mocked input devices and a matching input manager built in:

UML diagram showing the IInputService implemented by a real and a mock manager

Continue Reading →