This is a port/theft of tinykaboom from C++ to Futhark. It was done for the following purposes:
To see how easy it is to port such straightforward graphics-ish C++ to Futhark (very easy).
To see how fast it would run (see below).
If fast enough, to render the explosion in real time.
It looks like this (the actual rendering is much faster; I think browsers don't like high-framerate GIFs):
moduletk=import"tinykaboom"letstep=tk.main> :video (step 640i64 480i64 4.1e-2f32, 0.0f32, 300i64)
I tried to match the coding style closely, even in the naming and
order of functions. One of the notable differences is that the C++
version is able to use an ad-hoc polymorphic template function,
lerp, for linear interpolation of both vectors and scalars. For the
Futhark version, two functions are needed. This could have been
written as a single parameterised higher-order function, but I don't
think the complexity is worth it here.
I have added a time parameter to some functions, which is used to vary
the radius of the sphere, in order to give it an expanding feel. This
is used in the signed_distance function.
I think I do the colour computation slightly differently - my darks are not really very dark.
I depend on two small Futhark packages (vector) and (matte) for vectors and ARGB colouring respectively. If I were enough of a purist, I'd inline the necessary parts. The 110 lines mentioned in the title do not include these packages.
The runtime when rendering a 640x480 frame is as follows:
tinykaboom.cppcompiled with-O3 -fopenmpand running on a Ryzen 1700X: 1.3stinykaboom.futcompiled withfuthark opencland running on a Vega 64: 0.012stinykaboom.futcompiled withfuthark multicoreand running on a Ryzen 1700X: 0.38stinykaboom.futcompiled withfuthark cudaand running on an RTX 2080 Ti: 0.003s
It runs slightly slower than I would like, especially on the Vega 64, but that's probably just the nature of the beast. I inspected the generated code and could not find any obvious smoking guns, except for the kernel being fairly large. It's good enough to be real-time in a small window.
It would be cool if the explosion could be rotated a bit, or maybe not be the same for every run.
