Skip to content

Releases: jonathanhogg/flitter

v1.0.0b19

14 Nov 14:34
v1.0.0b19
65bdcb7
Compare
Choose a tag to compare
v1.0.0b19 Pre-release
Pre-release

Features:

  • Python 3.13 support
  • Can change the title of a window live now (w00t!)
  • New sort() function
  • A few changes to !noise to make it more useful
  • Texture mapping attributes have all been renamed (old ones still supported)
  • Texture sampler properties can now be controlled on a !material node
  • A completely new, saner UV mapping for !boxes
  • New cross() and dot() product functions
  • Support for keystone= transformations in !transform window nodes
  • Can now provide arbitrary ffmpeg codec options on a !record node
  • !adjust nodes now support hue= and saturation= adjustments

Under the hood:

  • A bunch of changes to the physics engine to simplify it a bit and improve performance
  • Moar async

Bug fixes:

  • Fix spherical remapping direction
  • Fix bug in how transparent objects with textures are dispatched
  • Fix bug in processing additional physics frames when running non-realtime
  • Fixed how physics groups work to match my original intention
  • Fix for offscreen windows on macOS
  • Don't explode if a transform on a manifold model makes it non-manifold (usually caused by a zero scaling)
  • Fix a bug in 3D lighting code with AMD GPUs on macOS
  • Fix for reloading when nested code dependencies change
  • Exporting videos with transparency now works again (only for the :prores_ks codec at the moment)

Plus the usual bevy of tweaks to the documentation.

Full Changelog: v1.0.0b18...v1.0.0b19

v1.0.0b18

07 Sep 19:43
v1.0.0b18
8ea58ac
Compare
Choose a tag to compare
v1.0.0b18 Pre-release
Pre-release

Fairly big release this time.

This release contains the following user-visible changes:

  • !electrostatic and !gravity forces now become constant when particles overlap to avoid unstable massive forces
  • The !material occlusion= attribute has been renamed to ao= to make it clear that this is ambient occlusion
  • !adjust now supports a color_matrix= attribute for supplying a 3x3 matrix to apply to the RGB channels
  • Unused !noise channels are now filled with 1
  • !physics simulations can now use a new !group node to control more precisely which forces apply to which particles. This is useful for reducing the computational complexity of large simulations.
  • !drag supports a new flow= attribute for giving a flow velocity of the pretend medium
  • A new !field force was added to simulate uniform electric fields.
  • A qbetween() function was added for calculating the Quaternion to rotate one vector to another
  • The Oklab colourspace is now supported via new oklab() and oklch() functions (both of which produce linear-sRGB colours)
  • We can now ask macOS to use the sRGB colourspace for windows iff the pyobjc and pyobjc-framework-Cocoa packages are installed (these are now optional dependencies that can be installed with pip install flitter[macos]
  • New inf and nan constants were added to the language
  • The gamma attribute has been removed from all window nodes except !adjust and the --gamma command-line option has been ditched (this special pleading is no longer needed now that sRGB is more consistent across platforms)
  • Tone-mapping support has been added with the new tonemap= attribute to !adjust, with the :reinhard and :aces functions implemented
  • !adjust also has new shadows= and highlights= attributes for applying exposure adjustments to only the darkest/lightest parts of the image
  • Emissive lighting has a new algorithm that is partially dependent on the surface normal – this is an attempt to make emissive lighting less flat
  • A new lens !flare filter has been added and, with it, new support for downsampled shader passes and a completely new texture/framebuffer pool-based architecture
  • New shadows= and highlights= attributes for !adjust for doing exposure adjustments on the dark or light parts of images
  • Window !transform filter nodes now apply attributes in order like in !canvas3d

It also contains the following, less visible, improvements:

  • The physics simulation of !barrier reflections has been improved significantly
  • !random forces are now seeded with a stable, reproducible seed (this caused problems previously when running tests)
  • Translucent objects are now rendered at the same time as transparent objects to ensure that the transparency ordering is maintained
  • The structure of the internal PBR lighting shader was reworked so that the big stuff is now done in reusable functions in an include file – this is useful if you want to write a custom lighting shader that would like to use these standard functions (like my example SDF sphere shader)
  • The plug-in API has been extended to 3D models; the flitter.render.window.models module was made usable from Python to support this
  • VM instruction optimisations were moved into the compiler instead of being done in a post-compilation pass. This works better as the compiler has access to more semantic information and can make better optimisation decisions.
  • The lighting calculations for translucency were tweaked a bit
  • The 3x3 matrix inverse calculation was broken and has now been fixed
  • !difference with multiple non-overlapping subtraction models now actually works

Also a bunch of documentation improvements, though still no documentation for !canvas.

Full Changelog: v1.0.0b17...v1.0.0b18

Release 1.0.0b17

16 Aug 20:51
v1.0.0b17
33a792d
Compare
Choose a tag to compare
Release 1.0.0b17 Pre-release
Pre-release

This release contains a bunch of bug fixes, speed improvements, OpenGL ES compatibility fixes, additional tests, documentation fixes and improvements and the following user-visible changes:

  • New !transform filter node for translating, scaling and rotating window nodes
  • New !vignette filter node for applying a simple, rectangular vignette (probably more advanced options coming later)
  • uniform() random variate now has 53 bits of pseudo-randomness instead of 32 – the beta() and normal() variates based on this are also extended
  • The sample() function now returns an RGBA 4-vector
  • Addition of run_time and frame global names
  • !video nodes have new trim= and back_and_forth= attributes for controlling trimming and looping backwards
  • New algorithm for computing !sphere meshes that generates half as many faces, with more even sizes
  • New quaternion(), qmul() and slerp() built-in functions for making and manipulating quaternions
  • The rotate= attribute of 3D !transform nodes now accepts a 4-vector unit quaternion for specifying arbitrary rotations

Full Changelog: v1.0.0b16...v1.0.0b17

Release 1.0.0b16

25 Jul 19:45
v1.0.0b16
99d8e8f
Compare
Choose a tag to compare
Release 1.0.0b16 Pre-release
Pre-release

This is a pretty big release that includes:

  • A bunch of changes to support running coverage analysis against the tests. This is now done automatically in a GitHub workflow so you can continuously judge me on that last stubborn quarter of the codebase that is untested
  • I did actually add more tests too though.
  • I also fixed a few bugs that that testing revealed.
  • An implementation of 4D noise was finally added to the built-in noise() and octnoise() functions. I have also finally properly attributed the source of the noise implementation.
  • The sample() function can now take a 2n-vector of coordinates to sample and will return a 4n-vector of RGBA color values.
  • A new length() function was added as a matching function to angle(). This allows a 2n-vector of cartesian coordinates to be turned into a n-vector of polar distances.
  • The simplifier was completely reworked to return the original Expression() nodes when no simplification is possible. This means that the simplifier is faster (as it is doing less object creation) and the engine is able to skip recompilation if simplifying on state results in no change to the tree. This generally means that state simplifying is less noticeable.
  • Some simplifier rules were tidied up.
  • A few VM optimisations were added (including a new ability to swap instructions where that usefully allows further optimisation to occur)
  • A bunch of improvements were made to multi-pass !shaders that allowed all of my standard shaders to be moved in-engine as nodes. So you can now use (more flexible) !blur, !bloom, (color-) !adjust, !feedback and !noise nodes.
  • Matrix maths was optimised by speeding up the creation of result matrices.
  • !slice-ing of models is now done using manifold3d, which means it actually works instead of sometimes spitting out hopelessly broken meshes.
  • Making meshes watertight for CSG operations has been made saner and is now cached.
  • The !physics extra-frame logic was completely redone as it had a habit of producing horrid visually-obvious speeding up of simulations.
  • 3D models are now cached forever and without limit. The LRU logic was a waste of time: if you're generating too many models to fit in memory then you have other problems that the cache can't solve.
  • Instance depth-sorting can now be turned off with depth_sort=false on render groups. This is useful if you're creating thousands of small models and the sorting wastes more time than early fragment discarding can save.
  • --autoreset idle state resetting was dumped – it no longer achieves what it was intended to.

Breaking changes:

  • The clock global name has been renamed to time. None of my code was using clock anyway and it wasn't consistent with the way I use the idea of frame time everywhere else.
  • The (very weak) compatibility with the pre-PBR material model has been dumped. This means that the shininess= and specular= attributes on !material have gone away. This was always a hack once I adopted PBR. You should be using roughness= and metal= instead.

Exciting new thing:

  • Flitter now has plugins. In fact, all of the internal logic is implemented as built-in plugins. However, you can now add your own top-level renderers, window (OpenGL) nodes, controller drivers and DMX interface drivers through Python package entry points and an entirely undocumented API.

Full Changelog: v1.0.0b14...v1.0.0b15

Release 1.0.0b14

03 Jul 16:21
v1.0.0b14
6456b92
Compare
Choose a tag to compare
Release 1.0.0b14 Pre-release
Pre-release

This release has the following changes from b13:

  • Reworked the AST to be a pure expression tree, removing the ugly special pleading done for Top and also:
    • removing Let and making InlineLet the only let (where is just syntactic sugar)
    • making Import introduce names into a sub-expression the same as let
    • ditching the StoreGlobal stuff in favour of a new Export mechanism that is injected into the last leaf of the AST via a parser rule matching EOF
    • extracting pragmas at parse time and storing them directly on the Program in the compiler
  • Tighter restrictions on module imports – no more access to state – which allows module exports to be cached so that they are only run once (unless the source file changes)
  • Addition of anonymous functions with new func(x) x*x syntax
  • Simpler for loops in the VM with the addition of tracking the number of bindings being done on each iteration in the LoopSource list; this allows ditching a few instructions from loops and dropping unnecessary operands from the loop instructions
  • A fix for a bug in simplifying on static state (it would collect old keys)

Plus it adds a heap more tests for the language in the form of unit/regression tests of the simplifier and compiler, and a bunch of integration tests of the language that test the interaction of the parser, simplifier, compiler and VM. Excitingly, these new tests unearthed a few significant bugs in the semantics and also shone a light on corners of the simplifier that could benefit from more work.

This release touches a lot of dangerous code in the language, but thanks to that mass of new tests I'm feeling pretty confident about it.

Release 1.0.0b13

26 Jun 13:53
v1.0.0b13
ec4db0b
Compare
Choose a tag to compare
Release 1.0.0b13 Pre-release
Pre-release

This is just a packaging change over b12.

Release 1.0.0b12

14 Jun 07:51
68eb4c3
Compare
Choose a tag to compare
Release 1.0.0b12 Pre-release
Pre-release

This release includes:

  • New rough n' ready translucency support
  • OpenGL ES improvements
  • A mass of fixes around using symbols with controllers
  • Support for multi-pass shader nodes

Plus the usual background noise of fixes and small improvements.

Release 1.0.0b11

23 Mar 22:27
v1.0.0b11
f246936
Compare
Choose a tag to compare
Release 1.0.0b11 Pre-release
Pre-release

This release includes:

  • Improved support for Windows
  • Compatibility with OpenGL ES
  • New "prime" identifiers in the language – these are identifiers that have one or more single quote "ticks" at the end (this is a feature that is borrowed from Haskell)
  • A few bug fixes.

Release 1.0.0b10

02 Mar 19:01
v1.0.0b10
3ef63f1
Compare
Choose a tag to compare
Release 1.0.0b10 Pre-release
Pre-release

This release is under-the-hood changes to get Flitter building on Windows.

Release 1.0.0b9

01 Mar 10:47
v1.0.0b9
4122e52
Compare
Choose a tag to compare
Release 1.0.0b9 Pre-release
Pre-release

This release introduces some functionality changes:

  • !physics tracks start time instead of last time and maintains a zero-based internal clock
  • The counter() function has been dumped in favour of new !counter objects

Additions:

  • !physics systems can insert additional time steps if spare CPU to catch up on missed steps
  • Approximations of sphere and line/capsule lights are now available in !canvas3d

Fixes:

  • Specifying spotlight cone sizes was broken in the b8 release