Scene Of The Girls / PPG

Scene Of The Girls is a demo made in 2003. Everything began as a simple joke: one day chatting with Ayame over irc we began speculating with the idea of making a girls-only demo so that everybody would be shocked when it showed in the partyplace. It was something on the lines of have you seen a demo done by girls only? why don't we show them we can do it too? yeah let's do it! we're going to completely puzzle them out!.

I had taken a Computer Graphics subject which included OpenGL laboratory practices and also had some code I had toyed with which showed a simple 3d scene with music, and thought: ok, why not? So I decided to gather all what I knew, plus a few NeHe tutorials and began building my first coded, really serious demo (I had done a fast one in a previous party but it was just a 4h hack of the aforementioned code which played some music and showed some 3d objects).

Scene of the girls

This was the first scene I did. We already had decided we would love to have something very classical, very AMIGA-ish in essence. I'm telling you, Ayame comes from a family of die-hard AMIGA users, so imagine! So that's why the demo starts as an homage to the classical State Of The Art (SOTA) demo. Even the title of our demo is a game with the title of the classic.

But, while the SOTA has a hand, we have a female sign (♀) showing up slowly, coming up from nowhere in the middle of the noise. Somebody told me it truly made an impression on him: It was imposing, kind of scary. Good! That was our intention.

Scene of the girls

SOTA had a static pixelated drawing which showed the credits. We would have a strawberry instead! That also was a joke because at that time, there was a celebrity which was nicknamed "Strawberry" and was always exhibiting her girl behaviour as much as she could. So I did this drawing but it actually looked more like a red pepper with spots.

Scene of the girls

Then there is a circles scene which is kind of similar to the interferences which appear at SOTA, although I imposed our silhouette over the circles and also added a laser ray which carves our nicknames out while leaving behind a trail of smoky particles. Impressing, isn't it? The most complicated part here was drawing the path with 3DSMax, and then ... parsing it! I artificially increased the number of interpolation points in 3DSMax so that I didn't have to interpolate them myself in the demo, just iterate and join points with lines. It's a bit rustic but it did its job.

The colours of the circles come from a palette that Sardu provided me. At the beginning they were more like pure red and pure green, but after the pre-party (which is the warming up act to the real party, a month before) I asked her if she would like to join in our girls-only conspiracy and help me with the colours. So I sent her what I had, and she returned me a jpg with a palette based on the drawings. Each color was numbered, so that she could tell me something like: for the circles, use 3 and 15.

Scene of the girls

We now move to another effect we liked: the black and white cube nest from dacube2/fuzzion. Although I spiced things up by adding one of ayame's drawings in the background using it as a kind of rotozoomer. But it still was recognizable enough that Dr.Pain/fuzzion said something on the lines of these cubes look familiar, don't they?

At the beginning the cubes were drawn by using two of glut's primitives (glutSolidCube and glutWireCube). Since I didn't want to depend on glut I have removed these two with my own functions.

This scene continues for a second part where there's some more rotozooming stuff but with different textures, the tangaflowers as we used to nickname them (because they looked like the style of some TV adverts which featured the tanga word in them).

Scene of the girls

Here's a 4 seconds stop. I always thought it was good to have pauses in the music. They help alleviate the feeling of continuous brain BOMBOMBOMBOMbing, and allow the audience to get surprised. So here's it. I took the opportunity to include here the ASCII drawing that diamondie graciously made. Since it was a bit empty, I also rendered a woman face with Poser and added it to the left. It doesn't look particularly cool and it would have been nicer to have a hand-drawn image, but it was only me alone in the party place at 4AM and no time to draw anything!

Scene of the girls

This is probably the scene most people remember, probably because it's the coolest one!

Scene of the girls

At this point, I had ran out of classic demo effects that I liked and could imitate, so I just began experimenting. I still don't really know how did I manage to do it. I was just placing several disks together, rotating and scaling them, and began playing with the fog, its parameters and whatnot, and it just ended like this. I still like it after all these years!

Sardu was so excited about the scene that she even gave me a lamp which looked a lot like this scene as a christmas present that year!

Scene of the girls

Finally come the greetings part. We not only wanted to impress the audience but we also wanted to win their hearts, so to say! So we decided we would greet everybody in the party! It was quite handy that Sardu was party organizer as well, so that she had a list of every group in the party. Maybe it was also a bit of a cheat too :)

This scene was pretty much finished when I came to the party, I had totally abandoned the idea of remaking classic demoeffects and continued experimenting with abstract shapes, the disks, circles, more or less the same red/black/white palette, etc.

It was funny because there was a silly bug which prevented the demo from exiting when the music finished. So in panic, we just began typing in text in the scroller, after all the greetings, which said "this has finished! press esc now!". I corrected it shortly after, but in the middle of the panic crisis I even got to ask Sardu if she could have a look at the C code and find out what was wrong (just so that you understand: she's not a programmer!). You should have seen her face...

The music

I had composed the song, hyperaktive dancing (MP3 version), something like 3 years earlier. At the beginning I was using another one, Semos los vengatas (MP3 version), but in a clever move, I decided to replace it with the final one because I had the feeling that songs with a prominent bassdrum would work much better in a party. It's all about strategy, baby! ;-)

Just in case you're interested, the song was composed with Impulse Tracker 2.14 and uses 54 channels, and approximately 2 megabytes of space. Before the purists scream in horror, it's 54 channels due to the echo effects that I added and because I like to keep tracks separated: a channel for bass, another for hats, etc. That way it's easier to adjust volumes, mute certain sounds only, etc. Some people like to brag about their songs which use only 16 channels or so, but if you try to edit them some months after they were composed, it's a nightmare because you don't remember what is each instrument.

Code postmortem

Although the general idea is clear (a switch in main.cpp decides which scene gets executed according to which order is being played in the song, sending in the row and order to the scene) the implementation is very messy because then some scenes want to have the elapsed milliseconds, other are happy with just the row and order and others also want the elapsed seconds. In following demos I changed to a more unified interface and there weren't lots of calls to music.getMilliseconds scattered all throughout the code.

Also, there's only an scenes.cpp file which --you guessed it-- contains all the scenes! That's approximately 3000 lines of code, after I deleted the extra unused stuff. That's not easy to handle, specially when you pick the code after years of not having seen it. Either you're very inspired or you simply will have to plod away at the code until you understand why some things work the way they do. In subsequent demos I split scenes.cpp in several files, one per scene.

It is also very error prone. A common bug is that a scene depends on certain OpenGL attribute being set to a certain value but maybe the previous scene didn't return it to the previous state. Or maybe there's an extra glPopMatrix and when you detect it in the third scene, and correct it when cleaning up the code, then you find that the rest of the demo begins to fail and some objects do not show up, because you added an extra glPushMatrix somewhere to compensate for that bug and you can't even remember about it. A better method is to explicitly set what you need and also make those push/pop more visible by wrapping them with more obvious methods (like setOrtho, resetOrtho).

The code is in my git repo:

  • Browse it
  • Check it out: git clone git:// Then it is in the releases/ppg/ppg01_sotg directory

Somebody said years ago he would love to make an OpenGL ES version - now you can! Although from what I understood OpenGL ES doesn't allow immediate mode and this demo is pretty much built over it, but anyway... fork it, read it, laugh at the comments, get confused by the names of the variables and methods (some are 50/50 spanish/english)