Wednesday, January 20, 2010

Volumetric lines 2

I promised I was going to do a follow up on the Volumetric Lines episode, so here it is.

Like I said, it was very easy to change from regular lines, to using volumetric lines in PewPew. In fact, I already changed once the way lines are drawn: the early versions of PewPew used SDL without OpenGL, so the lines were drawn in software using the good old Bresenham. Switching to OpenGL forced me to reduce the coupling between the renderer, and the game engine. Here is all I had to do to make the switch to volumetric lines, besides the initialization:

for (int index=0; index < numberOfVertex; index+=6)
glVertexPointer(3, VERTEX_TYPE, 0, vertexes);
glDrawArrays(GL_LINES, 0, numberOfVertex);

Here are some new screenshots comparing the regular render to Sebastien Hillaire's one with different line width.

Now this is running on a PC, not on an iPhone. I previously said that I could maybe port this glowing effect to a real iPhone/iPod Touch, but it requires programmable shaders, which are only available on the iPod Touch 3G and the iPhone 3GS. I only have an iPod Touch 2G, so I wouldn't be able to test it.

Anyway, if you do not like the glowing effect do not worry, because if I do manage to get this effect to work on a real device at a decent frame rate, I would put an option to keep the classic look :-)

Friday, January 8, 2010

Automatic .caf file creation

As I said in the previous post, I am currently working on adding sound effects to PewPew 2. The preferred format for sound effects with OpenAL on the iPhone is the .caf (Core Audio Format), but audio softwares usually output .wav files.
Fortunately, there's an easy way to convert one format to the other, using a built in command in OS X:
afconvert -f caff -d LEI16@44100 -c 1 in.wav out.caf

Being a programmer, I am lazy, so I started thinking about automatizing the conversion for all my .wav files using a small python script that would look like that:
for every file in the directory:
exec "afconvert -f caff -d LEI16@44100 -c 1 file.wav file.caf"

But it was not going to be efficient: every time I would want to regenerate a single .caf file, the script would regenerate all of them.

And then it hit me: makefiles are made to solve this exact problem. I tested my idea with a small makefile that looked like:
test.caf: test.wav
afconvert -f caff -d LEI16@44100 -c 1 test.wav test.caf
and it worked as expected :-)

I am sure lots of other people thought about using make for stuff other than compilation, but I am still satisfied of having found this on my own.

While I was at it, I did a small python script to generate the makefile. Everytime I create a new wav file, I simply have to run the makefile generator.

Now what's pretty cool is that you can make the makefile run automatically in xCode every time you compile your project. Even cooler is that by executing the makefile with make -j 2 (or make -j 8 for some lucky bastards), you get to exploit all the cores of your CPU for the conversion. Indeed, man make explains that the -j switch "Specifies the number of jobs (commands) to run simultaneously".

Try doing this in Windows. For me, it's clear that OS X and Linux are the best OS for programmers!

Thursday, January 7, 2010

Happy new year

First of all, happy new year. For some, 2009 was the year of the Ox and 2010 will be the year of the Tiger. For me, 2009 was the year of PewPew, and 2010 will be the year of PewPew 2!

In 2009, most of my time was spent on creating the engine and getting to know the iPhone. Now that the engine is done, I am almost exclusively working on the content: I am creating tons of new ennemies and even more levels.
I say "almost exclusively", because I actually did improve the engine. I did an important (though obvious) optimisation regarding the collision system (Chromatic Conflict is smoother now because of that), I made explosions luminous, and I am in the process of adding sound effects.

The light added to the explosions is just an expanding texture (not even billboarded) whose transparency increases until it becomes totally transparent. It's simple, but it looks real good, I can't wait to post a video.

The sound effects are handled with OpenAL. OpenAL enables you to specify the relative position of the sounds, though I don't know yet whether I will use this feature or not. Basically, this feature allows you to changes the volume of a sound effect, depending on the player's position. For instance, the nearer an explosion happens to the player, the higher the volume of the explosion will be. What's even more interesting is that the volume of an explosion happening to the left of the player would be higher in the left earbud than in the right earbud. You can create other effects, such as the doppler effect, but that would be overkill for PewPew ;-)