:::::::: readme.txt :::::::: Neonsky Final by Ephidrena Amiga Aga 060 demo Note: Requires about 1,8mb of chipram, boot from cli before starting the demo to avoid issues. Features: - 24 bit streaming music downscaled to 8 bit - Bitplane tunnels/ball/plane - Bitplane photo crossfader - Mandelbulb bump with ambient occlusion - Voxelscape with tiltable camera and fog - All effects in 640x256 running > 30 fps except the voxel - 2x Supersampled HDR copperbars with glow - Hires sprite overlays with superhires positioning - Final logo HAM8 fade - Final logo HAM8 horizontal blur Loaderror coded all effects and did some graphics Frequent did the music Evilryu did the normalmap and ambient occlusion map for the mandelbulb fractal Frequent writing: The track used in this demo came to me as a bolt of lightning to my head some years ago. Most of it was written within some weeks, minor adjustments added at a later stage. All work done in Propellerhead Reason and rewired to Ableton Live for improved mixing. The synthersizer sounds are made in 96khz/24bit resolution and antialiased down to 28khz/8bit with Sony Soundforge. Some audiophiles among you might recognize the use of 303 drumsounds. Original samples are in 16 bit resolution, and antialiased as well. Although intelligent noise cancelling was used to get rid of 8 bit artifacts, some noise is still present. Hardcore limiting might have reduced it more, but would have killed most of the dynamic range (if not all), which in my opinion is undesirable. But... what else can you do with something shitty as lame stereoseparated Paula from 1985?...I could have written a book about how much I hate stereo separation and the lousy dac converters mounted on all Amiga mainboards. Loaderror might as well fill in with some opinions about the slow chipram all Amiga models suffers from. Bah...enough from me. I'm glad the final version is done. Enjoy! Loaderror on the blogging keys: After seeing Britelite's excellent Hires intro "Hires State Of Conciousness" I wondered what else can be done in 640x256 resolution. Colour palette effects are essentially resolution independent. Same goes for per scanline modulo effects. The tunnels/movetable effects The texture is stored in the palette at 12x12 with lower resolution "miplevels" of 12x6, 12x1, 6x1 and 6x1 again. All together spending 240 palette entries leaving 16 colours free for a sprite overlay (greets). Each level has a different brightness and are resampled from the main 12x12 texture so that one can produce the light at the end of the tunnel without spending any processing power on this. Then each level is color cycled according to their size to produce the effect of the rolling texture. The y-motion is because the table is bigger than the screen (shocking!). 9 different tables are created per tunnel with partial angle and scroll offsets to mitigate the ugliness of 12x12 resolution movement. 1 of the tables are dithered using a variable ordered dither pattern to produce a more plasma like look. Works great on old monitors. The cross fader (photo effects) Another palette effect where the first picture is using colours 0..15 while the second picture is using colours 0..16 * 16. Then the result of the mix is calculated at the sum of these palette indices. For example a 50% mix of colour 1,1 will be placed at colour index 16*1+1. The sum is a side effect of placing the first picture's bitplanes using bitplane pointesr 0-3 and the second image bitplanes at pointer 4-7. The neon copper bars A 1D RGB buffer of 256 lines*2 subsamples*3 components is created. Then additive draw a set of 1d points into this buffer. Then perform a IIR blur filter back and forth to add the glow. Then downsample, clamp and put it as a copper list. So it is 2x Supersampled HDR copper bars with bloom. The voxel Rotate/translate some camera rays, intersect them with a plane on left and right side of the screen (a lot of calculations become 0 because the plane coefficients are 0,1,0,0. 2 intersections figured out per line where one is free since the camera can't roll and hence the intersection just depends on y height and y-angle). Look up height map at the intersection point Fill and compare with height buffer to avoid overdraw. If the intersection point is the same as the previous intersection point for this horisontal pixel position then it means we are on top of the voxel so increase brightness to highlight it. When drawing on the side fade towards black as drawing downwards to make this "ambient occlusion" look. The palette is organised to have shading and fog like this colour = pal[shade+fog*16]; Shade is 0-16 and the palette gets more and more foggy on increments of 16. The 2d mandelbulb bump with ambient occlusion Evilryu (quite active on Shadertoy) made a nice mandelbulb effect and I asked if I could get the normal map and ambient occlusion maps from it. Then these were combined by shortening the normals of the normal map using the ambient occlusion factor. Then afterwards this image was converted from true colour to 256 colours. Then we effectively have only 256 unique normals to shade for the image and hence it is resolution independent again. So 2 directional lights + ambient were calculated in palette space and it applies to the whole image using no effort. The image is 640x512 scrolled upwards. Sprite overlays Hires AGA sprite 16 color overlays. The resolution independent sprites are a nice HW feature. They are positioned at subpixel accuracy on 35NS increments for smooth movement. HAM8 Fade Fading the final logo in HAM8 is not just about fading the palette. One must additionally modify the pixels where the R,G and B are selected to be modified. This routine is fairly sluggish and can be improved a lot. It uses 8bpl c2p while 6bpl would be enough since the two final planes are static. Additionally the fade code is in C which I haven't dared look at. Maybe next demo there will be a faster HAM8 fade.. Or maybe this is quite boring in the first place. HAM8 Horizontal Blur 8 pre-blurred Hires HAM8 pictures were interleaved so that every 8 line is sharp and the lines between have varying degrees of blur. Then a blur level is selected per scanline using the modulo registers in a copper program. Other stuff The effects use a lot of chipram being in Hires and all. So I quickly ran out of chipmem even after precalcing two of these tunnel effects. So I made a "system" of copying data back and forth between fast and chip ram. Next time I want to make it progressive as the chip copy can be noticed by a lag at the beginning of each effect. The ancient startup code got translated from assembly to C (yes startup code in 100% assembly for historic reasons). First Ephidrena demo to actually use Amiga hardware capabilities except what is needed for 256 color chunky to planar effects. Now there is some foundation code in place for making more use of it later. This was one of my main motivations for making this demo :) The first Neonsky was using system code, but since I couldn't iron out all the minor glitches and felt like there was magic going on behind the scenes I decided to code my own sprite and screen handling routines. Of course this opened up another can of worms, but atleast they were my own worms. Demo coding process: 1) This will take 1 hour, I'm a genious! 2) Oh no! 3) Why do I do this thing. I'm old now 4) Oh this says i, but should have said j 5) Goto 1