Last Goat Standing - Part 1

April 02, 2021

This is a multipart write up of the demo Last Goat Standing we did for the Revision 2021 Online Amiga demo competition.

Introduction

Last Goat Standing was our contribution to the Amiga demo competition at the Revision 2021 Online demo party. If you don’t know what a demo is or what Revision is see: https://en.wikipedia.org/wiki/Demoscene

A selection of demos for ‘outsiders’: http://www.gnilk.com/demos_for_outsiders/

The target frame rate for Last Goat Standing was at least 25fps for any screen on an 68060 @ 50Mhz.

Idea and Goal

After a while the following was set as the guiding principles for this demo

  • No polygon based effects (polygons only used as transitional effects)
  • Max length of a single effect is 20 seconds (exception is the writer in the beginning)
  • Short and sweet, don’t overstate stuff..

I think we managed quite well. At one point we had too many scroll based effects. These were cut, for example the raytraced scroller (remake of 2nd Reality by Future Crew).

The demo development started out with the voxel routines as I wanted to write these effects once and for all - I had never experimented with other 2.5D based effects besides the regular landscape. From there I was taking inspiration from demos released in the late 90’s early 2000. For instance the particle effect is more or less lifted from Non-Stop-Ibiza by Orange. The chaos zoomer (didn’t make it) was also one of these.

Process

We used more or less the same process as for Dark Goat Rises (described here: http://www.gnilk.com/amiga_demo_2/). However we utilized YouTube much more than before. During the making of this demo I posted around 50 various videos on our production channel.

The demo was developed in chunks. Starting of with effect experiments, which were just thrown together. Reusing old graphics as placeholders. One we had some kind of skeleton we tested out various tunes.

The demo was fully developed on macOS using the FS-UAE emulator for functional testing and FPS measurements on a real Amiga 1200 with a 060 card.

Here is an early preview from June 2020 using “Johnny Comes Marching Home”.

It also shows a few effects that was discarded in the end…

At the end we decided to go with a more dark electro type of tune. Between June and October we mainly worked with the intro sequence and the transitions. In October Evade had the first draft of the music ready:

Besides using YouTube to share regular previews with the team we also used it to ‘vote’ on effects. Here is a video showing two techinques to render the final twister/voxel stock. The right side version won, you can see in the video that Z-buffer was not yet implemented and that the effect suffers from overdraw around the edges. Also the striping was straight and not as seen in the final version.

Tooling

There was quite a bit of tooling written for the demo. Some of these are quite obvious for any Amiga developer (at least I would imagine).

  • Credits, the outline is extracted from a true type font and saved as line-segments which are then drawn
  • Raytracer (not used), used to save reflection information in separate tables in order to allow for changes realtime to be reflected by the static environment
  • Image converter with palette reallocation and other things
  • Subpixel calculation of images to enhance slow moving assets (part of image converter)
  • Various performace counter analysis to show graphs and similar, used to find performance bottlenecks

A lot of the tooling was built in to the parts. Specifically pre-calculation of tables and so forth. While this worked perfectly on macOS (low resolution, fast FPU, no worries) it was not an option on the Amiga. On the Amiga these were replaced with loaders instead of pre-calc.

We also had a way to allow parts to render an overlay UI (using IMGUI) for quick testing of effect parameters and such. The demosystem would automatically throw up a small palette viewer and editor. This was invaluable for color-ranges and asset palette allocation. IMGUI_Part

We used a modified version of RocketEditor by Emoon/TBL to control most of the sync parameters. The demo have around 75 sync channels.

Framework enhancments

This is the part you never see. We did quite a bit of work on the framework to have better cache optimization, fix-point (in various ways) support, 3d pipeline (completely unused), improved the view frustum clipper, and so forth.

While we had previously relied on intermediate mode rendering (one triangle at the time) we switched this to an array based pipeline, for cache reasons. We wrote a new tile-based rasterizer (see: http://www.gnilk.com/tilefiller/) and much more. In the beginning we had other plans for the demo - but for reasons - the plans changed.

We also removed some of the Amiga assembler system code and replaced it with C versions, like the Copper handling. Also added the IMGUI backend allowing us to render inplace UI’s.


Profile picture

Written by Fredrik Kling. I live and work in Switzerland. Follow me Twitter