27 Jan 2009

Rant: Microsoft needs to sort out this fucking mess with region-locking on Xbox Live. See: as a German Xbox360 owner it’s like back in the Cold War, but this time it’s not just the Eastern Germans who are fucked because they were born on the wrong side of the Iron Curtain. We’re condemned to buy overpriced, censored, poorly localized games. If they’re available at all.

Which itself is not a problem for every 360 owner in his right mind. Simply order the UK version of a game, which is usually cheaper, has the original voice tracks, and isn’t mutilated beyond recognition. That’s all good and dandy until it comes to DLC. In the good old days before The Wall was erected (this was around the time when the movie download service started on XBL), this was not a problem either. Just create an English Live account, upload a few space bucks, and buy the matching DLC for the UK version of a game. Not so anymore! A strict IP address check is performed now. If you’re dialing in through a German provider you’re fucked. There is a way to circumvent this by using a foreign VPN service. But come on! We’re living in the free world now, not in some frigging soviet colony.

The whole situation is really a completely incomprehensible mess:

some games are not released in Germany at all, mostly Microsoft first-party games, for instance Gears Of War 1 and 2, Ninja Gaiden 2 and Crackdown

some games are released, but in a cut version (no blood, etc…)

some games are released which are not cut at all (Dead Space, Resident Evil 5)

some games have the original English voice track, some only have a localized track

Somebody please explain to me, why a game like Resident Evil 5 is released here, while Crackdown (a comic game for fucks sake!) is not. Why does EA or Capcom manage to get USK-18 ratings for their *uncut* games with realistically exploding heads and all, while Microsoft doesn’t even bother? And why the fuck does Microsoft care at all if the USK doesn’t want to rate a game? Put a fucking “this game is unrated” sticker on the box and be done with it like everybody else does. It’s not like its forbidden to sell a game in Germany which didn’t get a rating.

25 Jan 2009

I’m currently playing Metal Gear Solid 3 Subsistence on the PS2 (the new chase camera is wonderful), and also started a new MGS4 run in parallel. I just wanted to make sure that I’m not a victim of nostalgia with my opinion that MGS3 is the better game. To make a long story short: MGS4 lost again. This time I played MGS4 “old-school”, no rifles, just the knife and the tranquilizer pistol. This makes the game much more fun, but still I couldn’t get past chapter 2 before getting bored.

With MGS3 however I felt the same urge to continue playing like the first time. The story and cut-scenes are great and never boring, Volgin is a wonderful villain straight out of an old Bond movie, the boss-fights are truly unique (the legendary sniper duel with The End!), and the whole stealth and survival game-play is much more fleshed out compared to its successor… Looking at all this goodness I wonder how the hell MGS4 could happen. There were so many great elements in the previous MGS games which have been dumped and replaced with all this “shooter-crap” which doesn’t fit at all into an MGS game… And the only thing I can remember from the MGS4 story is that nanomachines are bad (damn nanomachines, first they ruin Star Wars, and now look what they done to MGS!).

An MGS3 re-release on PSN (or XBLA hehe) in anti-aliased 720p and maybe a high-res texture pack would make me a happy gamer. The actual 3d models still look surprisingly good (the tree models and the grass for instance are better then in many current-gen games).

17 Jan 2009

The keyboard of my Vaio is starting to act funny, and I guess the 512MB RAM and 50GB hard disc don’t quite cut it anymore either. It’s been serving me well for the past 3 years, longer then any desktop PC I had before, so I think it’s time to finally put it to rest. I’m currently ogling the Samsung X360, the only things I don’t like is the price and the Intel graphics chip. But damn everything else is sexy. I have the following must-haves for my notebook of choice:

a 13.5 inch display, this makes the notebook just as big as an A4 sheet of paper, anything smaller is too small, and anything bigger is too clunky :)

weight, I’m dragging around the notebook quite a bit, so the lighter, the better

battery life, I like to work when travelling by train, but only ICE trains have power sockets in Germany

needs to run VisualStudio, and must be able to run my own DirectX stuff (this rules out MacOS X, and using a Powerbook to run Windows is kind of a sacrilege, oh and… only web designers use Macs, rite?)

needs to have at least Shader Model 3.0 graphics

needs to have enough oompfh for Vista and Windows 7

Some of the new Vaios are runner-ups as well, but they are even more overpriced then the X360 (which is quite typical for Sony products) and I loath how Sony pre-loads the machine with heaps of useless software. I need to check out whether Samsung is guilty of this as well, but it’s hard to imagine they’d be worse then Sony.

As I wrote in my CoreAnimation post, the Nebula2 animation system was in dire need of a new design and a clean rewrite. During Drakensang’s development and another research project which focused on facial animation, we had to add new features on a system which wasn’t designed for those capabilities. The resulting system worked, but just barely, and from a design standpoint it became quite an un-maintainable mess. When working within the constraints of a commercial project (defined by milestone dates, features and quality), this is often the only choice, it’s usually better to have something working at the end of the day (even though it’s a bit ugly internally), then to slip milestones. At least it was clear, what features would be important for a clean redesign, and how they shouldn’t be implemented.

With Nebula3 as an experimentation test-bed I started to work on a new animation system even before Drakensang was finished. Some of the main problems of the old system were:

animation low-level and high-level features where implemented all over the place, some in Nebula2, some in Mangalore, some in the application

sampling at random points in time wasn’t properly supported (the cross blending code required that the sampling time was modified at positive increments)

there was no priority blending, and blend weights had been normalized to add up to 1, this gave “funny results” unless the application provided “carefully tuned” blend weights

blending of partial animation (where only a part of a character skeleton is animated) wasn’t properly supported at first, and sort-of hacked in later

it wasn’t possible to blend 2 identical animations at different sampling times

animation clips could not be started in the future or past

… and a lot of small bugs and quirks which resulted from the growing complexity of the animation system

The first design choice was to split the animation code into 2 subsystems: CoreAnimation and Animation. CoreAnimation has already been described here.

While CoreAnimation mainly cares about resource management, the higher-level Animation system provides features to implement complex animation blending scenarios.

When starting the Animation subsystem I was considering blend trees. The leaves of a blend tree would be sampling nodes, which sample a single animation clip at a specific time, and the nodes of the tree would accept sampled data at the input connectors, mix (or otherwise process) the incoming data into a single output connector, until, at the root node of the tree, the final result would be available. After a few weeks of work and several interface revisions it became clear that working with such a system would be much more complicated then even with the old Nebula2 animation system. When feeding the blend tree system with “real world scenarios” I never ended up with a satisfactory simplicity, instead even relatively simple blending scenarios looked incredibly complex.

Thus I scrapped blend trees, and started anew with a more straight-forward priority-blending system based on animation tracks (roughly like Maya’s Trax Editor works). With this new approach, everything suddenly fell into place, and after just a few days, a first implementation was finished.

The new Animation system has 2 important object types: AnimJob and AnimSequencer.

An AnimJob represents a single animation with the following attributes:

Start Time: The start time of an AnimJob, can be in the past or in the future.

Duration: The duration of the AnimJob, doesn’t have to correlate with an animation clip’s length, it can also be infinite.

Blend Weight: The final weight used for priority blending inbetween the fade-in and fade-out period.

Fade-In / Fade-Out Time: the time used to smoothly blend the clip with the current previous result.

With the Start Time, Duration and Blend Priority attributes, AnimJobs can be arranged by an AnimSequencer object in a 2D coordinate system where the horizontal axis is time, and the vertical axis is blend priority. When sampling at a given point in time, the AnimSequencer first finds all animation jobs which cross the sampling position. Then, starting with the lowest priority animation job, each active job is evaluated and the resulting animation samples are priority-blended with the previous blending result.

AnimJob is just a base class which can be subclassed to hook custom functionality into the blending process (like inverse kinematics, or some lookat-target functionality). At the moment there is only one specific subclass: PlayClipJob, which simply samples an animation clip.

The new Animation subsystem fixes pretty much all problems of the old Nebula2 system:

automatic blend-weight normalization has been replaced with priority-blending which is much more useful in typical blending scenarios

it’s now possible to correctly evaluate animations at random points in time, with correct cross-fading

correct blending of partial animations (where an animation only manipulates parts of a character skeleton) is now a standard feature

animation clips can now be blended with themselves

animation jobs can be started in the future or in the past

Overall, the new Animation system is much simpler, robust, easier to use and easier to understand.

A few things are still missing which proved useful in the past, or which we identified as a nice-to-have-feature:

Some sort of name-mapping for animation clips:

In Drakensang, every character had about 400..600 animations, most of those were combat animation variations (different attack types, different weapons, with or without shield, etc…), but the animations actually fell into only a few categories (like attack, idle, walk, …).

It would be nice if a mapping mechanism would exist, where the application sets a few variables (like type of weapon in hand, shield in hand, etc…), and then maps an abstract animation name like “attack” to a specific name like “male_twohandedsword_attack1” by resolving a few user-defined mapping rules.

Some sort of finite-state-machine to define how animations relate to each other.

This is mainly useful to automatically play transition animations. For instance, if a character currently has no weapon equipped, but he needs to play an attack animation, the state machine would decide that a “draw sword” animation needs to be played first.

5 Jan 2009

Today I'm finally doing the transition to Vista. After my first and failed attempt in April 2007 I've now got a new work desktop with 32-bit Vista installed: a Dell XPS with Core2 Duo, 4 GB RAM, NVIDIA 9800 GT and a 700 GB hard disc. It's huge and f*ck-ugly (a true PC indeed), and it glows blue in the dark. Seriously, who's designing those machines nowadays, and for what target audience?

I'm pretty happy with Vista now. Looks like all the problems from 2 years ago have been fixed, disc and network performance seems good, and everything feels "snappier" then on my previous machine (although, given the better hardware specs, it better should!)