/* attempt to deal with prototype, bootstrap, jquery conflicts */ /* for dropdown menus */

Jump to content

April 2014 »


etodd makes games

4: Adsense

Screenshot Saturday 168

This week was a ton of performance optimizations and graphics upgrades.

Cascading shadow maps! Basically that means all the shadows are much sharper. It was surprisingly easy to implement and barely impacts performance.

Here’s a screenshot showing off the new shadows, plus a new character modeling experiment. Just testing things out for now. What do you think?

Posted Image

Turns out, Blender has something called Rigify that can automatically generate an absolutely kick butt IK rig for your character, complete with blend weights for skinning. It’s not perfect, especially when there are separate disconnected pieces (eyeballs, for example), but the few problem areas are easy to correct manually. Here’s the character animated with the default calculated weights. I haven’t touched them at all yet:

Posted Image

That animation is a grand total of three keyframes. I just have to move one IK control, and the rest of the body responds naturally. The rig I have now is entirely FK, meaning to get the animation above I would have had to manually rotate the joints of the legs and arms to get the hands and feet to stay planted. This is one reason the placeholder animations are so terrible. Just having an IK rig means animations will be instantly better.

Again, this is all very experimental but I think it could save a ton of time. Rigging and animation both seem like much easier problems to tackle now. If I continue with this idea I’ll definitely post an article about the whole Rigify process, because there is a huge lack of documentation on the subject.

What else is new? Oh, one of my players built this insane structure using the wallrun mechanic… it was slightly exploitable. I went ahead and patched that.

Posted Image

More info about the performance optimizations that happened this week:

My deferred renderer now uses material IDs rather than storing specular properties for every pixel. Now I can cut the G-buffer down to 96 bits spread across three render targets:

Render Target 1

Albedo – RGB, 8 bits per channel

Material ID – 8 bit index

Render Target 2

Normal X and Y – 8 bits per channel

Motion blur velocity X and Y – 8 bits per channel

Render Target 3

Depth – 16 bit float

Normal Z – 16 bit float

Nice things about this setup:
  • I can store normals in world space, which is fast, easy, and artifact-free.
  • Storing all three dimensions of the normal (as opposed to storing only two and reconstructing the third) is nice because I can encode an extra scalar by multiplying the normal by it. The lighting system can recover that scalar later on by taking the length of the normal. Right now I just use zero-length normals for rain drops, which accept lighting from any direction rather than doing any kind of Lambert shading.
  • Lighting and objects with alpha transparency go into 64-bit floating point buffers later on, so we still get full HDR.
  • I can come up with a bunch of different material properties that I can bind to material IDs without adding bits to the G-buffer. Right now I only have two: specular exponent and intensity.
That’s it for this week! Thanks for reading.

Mirrored on my blog

Screenshot Saturday 167

First, I forgot to post here about the Kickstarter failure, so here's the update I wrote in the final hours of the campaign:

I'm happy to announce that regardless of the Kickstarter outcome, production of Lemma will continue.

To be honest, I originally planned to cancel everything if the campaign failed. I figured a failed Kickstarter would be a sign that people aren't interested, and that I should cut my losses (nearly 4 years of work) and move on. But in the past month I realized a few things:

  • I was kind of shocked at first to find out that people love the game. I'm continually surprised and delighted that people can look past all the flaws and garner an enjoyable experience out of something I've created.

  • I overestimated the amount of work ahead of me. I thought people would blow through the demo in no time and complain about how short it was. The reality is, not a single Let's Player has finished the demo in one video without a lot of editing. Some of that is due to frustrations with level design and controls, but a lot of it is just that people like to explore the world and figure things out for themselves, which is amazing. Armed with that knowledge, I'm much more confident that I can create the experience I want in a reasonable amount of time.

  • Running a successful Kickstarter takes a lot more than just a great vision with a solid prototype. I failed big-time in the PR department, partly due to lack of experience, and partly because I'm just bad at it. I make games, I don't sell them.

  • With that in mind, I realize now that if a Kickstarter fails, it doesn't necessarily mean the idea is not worth pursuing. Many failed campaigns later re-launch and go on to exceed their goals. (I won't be doing that because I don't want to take any more time away from development.)

Knowing all that, I'm confident that I can find the necessary resources to make this game happen even if we don't reach our Kickstarter goal. It may take more time and money on my part, but it will happen!

In fact, it's happening right now. I better get back to coding!


So, with the Kickstarter finished, it’s back to our regularly scheduled programming.

I am in the middle of a major graphics engine upgrade. This whole time I’ve been using fake HDR. Basically I divide every color by 2 when storing it in a texture, then multiply it by 2 whenever I read it from the texture. It works but you end up with lower color fidelity.

Now everything is done in full 64-bit floating point textures. Here’s an exaggerated before/after shot so you can see the difference. Notice the color banding on the left.

Posted Image

I was also skipping a few major steps of the usual recipe for bloom, namely downsampling and later resampling with a linear filter. The new bloom effect is much prettier. Here it is in action, along with some crazy geometry bugs I encountered while optimizing the vertex buffer code:

Posted Image

Lastly, I’m experimenting with a new effect for the slow-motion predictive block system:

Posted Image

That’s it for this week. Thanks for reading!

Mirrored on my blog


We are now in the midst of the final week of Kickstarter funding! With the campaign nearing the end, I thought I would give you another development update.

First, I spent a few days completely rewriting every bit of text in the game to support multiple languages. You can now change the language from this nifty selector on the main menu, and the whole game instantly switches:
Posted Image
Now all we have to do is translate ALL the things!

Next: I've been thinking hard about the phone mechanic, which is one of my favorite features in Lemma. I'm not aware of another game that does something similar. However, the execution leaves something to be desired. The phone conversations can not be skipped, and they can pop up right in the middle of your parkour flow, which gets old fast.

I've decided to add a new twist to the phone: signal towers. You will not be able to send or receive text messages unless you are near a signal tower, which means you could technically skip every phone conversation just by avoiding them.
Here's a look at one of the signal towers, suitably abstracted to fit within the aesthetic of the world:
Posted Image
This also opens up new writing possibilities for me, because now the player can actually initiate the conversation instead of only responding. Making the conversations skippable also improves the experience for speedrunners, which is good for a parkour game!

More features are in the pipeline as well. I collected some reference images and did a rough sketch of the player for a character artist to get an idea of what she looks like.
Posted Image
As I've said before, redesigning the player character and animations is the primary purpose of this Kickstarter. So hopefully an artist will be able to take my very rough ideas and turn them into an awesome model.

Lastly, some good news for audiophiles! AudioKinetic, the company that makes the industry-standard Wwise audio engine, recently announced that their product is free to use for projects with under 200 assets, which fits Lemma nicely. This engine should dramatically improve the audio quality in Lemma. Switching to Wwise is also a necessary step for a possible Mac and Linux port. Here's a screenshot of the Wwise content editor in action:
Posted Image
So that's what I've been working on. Now you're up to date! Thanks again for all your great support. Let's keep this going and get it funded in the last week!


From the Kickstarter:
Posted Image
It's not every day you see this email in your inbox.

WE ARE ON STEAM! Thanks everyone for your votes! We were part of a batch of 75 titles, even though we hadn't reached the top 100 yet. Go check out the other games that were greenlit today!

Here are the statistics for anyone interested:

Posted Image

My theory is that the traffic dropped off a cliff at the end because we were already approved and got removed from the rotation. I have no evidence to back it up though.

What else is new? Oh not much, just the brand new build 353 with more features, bug fixes, and level design tweaks than you can shake a stick at. If you didn't have time to try the original demo, now's a great time to give it a go! Here's a very incomplete list of improvements:
  • Smoother movement. The kick and roll are much more forgiving now. Frustrated that you couldn't reach that ledge? Fixed that too.
  • Fixed several long-standing bugs, including the infamous "my camera is locked and I can stare down my own neck" bug.
  • A big chunk of the notes and text messages have been re-written.
  • Experimental "expander" material previously seen here.
  • Performance improvements! Yes!
  • Cheat menu. You can now skip through the demo if you've played parts of it before.
  • Just so many level design changes. Every single level underwent surgery, plus there are entire new sections, like this one:
Posted Image
Spoiler alert: it's Dagobah swamp.
Thanks again for voting on Steam, and stay tuned for more updates!

Cheat your way through life

From the Kickstarter: Just an update on development progress for Lemma! Thank you so much everyone for your support. I’m still getting tons of useful feedback from people playing the demo. Levels have been tweaked, bugs have been fixed, writing has been edited, and graphics have been tightened. Expect a new build very soon! Here’s some new features to look forward to:

First, a minor technical detail. Saved games do not carry over between builds. If you run a newer build, all your old saves will be lost. It’s a major drag for beta testers, which is why I’ve added a new CHEAT menu to skip parts you’ve already mastered!
Posted Image
If you played the demo, you probably had a startling meeting pretty early on with what I am calling “the evil cubes” (they usually cause a reaction like this). Unfortunately in the original release, you only encountered them in the first level as part of a scripted sequence. They weren’t actually functional agents in the game.


Posted Image
For now these guys will be tucked into a secret area in the next build. If you do find them… good luck. Side note: see how the rain drops actually respond to the lighting? I thought that was a neat touch. :)

Lots of things have been tweaked that are more boring and difficult to show off, including the movement code and animations. One thing I can show you is a sneak preview of some upcoming level design:
Posted Image
In other Kickstarter news, you should check out this intriguing post-apocalyptic interactive novel called The Seed. The gameplay concept and artwork look amazing!

That’s it for now, but keep your eyes peeled for a new build soon! In the mean time, thanks for your support and let’s keep it up!