Releases: jonathanhogg/flitter
Release 1.0.0b28
The user-visible changes in this release are:
- A new
%includedirective that parses a source file and pulls it in to the AST at the current point – this means it will be effectively indented into the same scope as the directive, including having access to any names defined at that point and evaluating into the current sequence. - Support for flipping
!images. uv_remap=:spherenow correctly inserts a seam at the 0° longitude line and wraps the texture mapping around. You will probably also want to be usingrepeat=trueto get this to work correctly.!flarenow supports halos around bright spots as well as starbursts and ghosts. No user-controllable knobs for this.- Spotlights are now allowed to have up to 360° cones if you want (yes, I know that's not a cone).
!model vertices=...no longer needs to havefaces=...specified. If you don't give it then the engine will shrink-wrap the vertices with a convex hull.- New
<<inline append operator – best understood from the docs. - The old stable-state simplifying machinery has been replaced with
let stable. This allows defining arbitrary names/expressions that are expected to be mostly static. The engine automagically manages (re)simplifying the code on these values. Again, more in the docs. !canvasshould now work on Wayland.
Other that these changes, there's been a bunch of bug fixing – particularly in the use of the manifold3d engine for CSG operations.
Full Changelog: v1.0.0b27...v1.0.0b28
Release 1.0.0b27
This release now supports !canvas 2D drawing under OpenGL ES with Linux, thanks to recent changes to skia-python. It contains a few GLSL fixes to code that wasn't ES compliant, but is otherwise basically the sae as b26.
With a little luck, it will also now have ARM64 wheels for Linux…
Full Changelog: v1.0.0b26...v1.0.0b27
Release 1.0.0b26
Not a huge amount in this release, but a few noteworthy changes:
- The simplifier is now much faster at working out what names are free/bound in expressions (needed for closures and unused-let-elimination) – it turns out that this was a surprising performance drain.
- There are also a bunch of other minor performance tweaks to the simplifier.
- 3D primitives can be converted directly into manifold objects if that's what we need.
- Time-codes and symbols can be used on the command-line when defining static name bindings.
- The AGX tone-mapping function (plus the "punchy" variant) has been added to the
!adjustnode. - @ingydotnet contributed a bunch of YAML fixes to the GitHub workflow files.
- A few documentation fixes.
Full Changelog: v1.0.0b25...v1.0.0b26
Release 1.0.0b25
Main changes
- Timecodes have been added to the language – these are
hh:mm:ss.sss-style literals that are converted into an equivalent number of seconds !barriernodes may now have amaximum=distance as well as a minimum- The use of
trimeshhas been removed from most model operations, this improves performance and reduces memory usage - Specifying a
!modelwith vectorvertices=andfaces=, where these change continuously, has much better memory performance - The
!noiseGLSL shader code was pretty broken somehow and this has now been fixed - The cursor is now turned off by default for full screen windows; this can be controlled with a new
cursor=attribute - A major bug with function inlining and shadowed names was fixed
- A whole load of documentation improvements
Full Changelog: v1.0.0b24...v1.0.0b25
Release 1.0.0b24
User visible changes in this release:
- A new mechanism for creating 3D models programmatically using
!model vertices=... faces=... !sdfnode now accepts the samesmooth=,fillet=andchamfer=attributes as!union(since it is an implicit union operator)- A fix to
nearest=trueshader input sampling, which was accidentally disabling the border settings - New grammar for sub-vector searching:
x in y(note that this has subtly changed the rules around using "reserved" names) - New grammar for binding a sequence expression to a name:
let x = expr1 expr2 ... - The precedence rules have changed for anonymous functions so that they now bind a bit less tightly and thus can contain inline for loops, where clauses and other anonymous functions without parentheses
- New
product()function - New optional second parameter for
colortemp()function that specifies whether to normalise the luminance of the returned colour or not - New
uv_remap=:planeUV remapping scheme for topographical mapping
Less visible changes:
- The 3D model caching framework has been changed to cache based on a (probably-)unique 64-bit identifier instead of the user-readable name; this increases the speed of model collection and will be particularly noticeable if rendering thousands of identical structured models
- A more robust mechanism for figuring out which outer-scope names a function is capturing
- The simplifier will now attempt to inline calls to recursive functions if any of the arguments are literal; it will abandon the attempt if the expression tree becomes too deep
- The simplifier is now able to throw away unused
letbindings - The simplifier has gained rules for collapsing mathematical expressions involving a
nullon one side - Grammar rules around comparison operations have changed in a way that shouldn't matter unless you were doing weird/bad things with them before
- A bunch more tests
- A bunch of documentation improvements and fixes
Full Changelog: v1.0.0b23...v1.0.0b24
Release 1.0.0b23
Visible changes:
sum()now returns0for an empty vector instead ofnull- A new collating
mean()function with similar behaviour tosum() - Resolve inconsistencies between use of
minimum/minandmaximum/maxattributes in different places by making both versions acceptable everywhere - Switch to using the model matrix cofactor for normal matrices instead of using the transposed inverse. This is faster and more correct – in particular, it means that scaling by a negative value will result in the model normals being reversed to correctly match the reversed face winding
- New syntactic sugar for nested
forloops:for x in a, y in b - The grammar rules have also been changed slightly to allow
;sequences to be used as for loop sources without needing to be wrapped in brackets - New
nearest=falseattribute on window nodes can be used to turn off linear interpolation on sampling - A load of documentation fixes and improvements
Full Changelog: v1.0.0b22...v1.0.0b23
Release 1.0.0b22
This release contains the following visible changes:
- Signed distance functions - these are available with the new
!sdfnode, which contains an otherwise fairly normal-looking models hierarchy but which allows for smoothed CSG operations and custom functions! !slicehas been renamed!trim- but you can still use!slicefor compatibility- A new
inverse()function for calculating the inverse of a 3x3 or 4x4 matrix - Flitter functions that call context-dependent built-ins (like
read()) no longer use the path context of the module in which they were defined. The semantics of this broke under inlining and were too hard to retain in that form. Arguably it was confusing anyway. - The
!edgeswindow node supports a newmixerattribute for mixing in some of the original input to the output.
and under the hood:
- Python 3.13 support
- a new mechanism for clearing the models cache of unused 3D models
- a massive heap of fixes to tiny bugs in the models architecture found during the addition of regression tests
Full Changelog: v1.0.0b20...v1.0.0b22
Release 1.0.0b20
Features:
- Can change the title of a window live now (w00t!)
- New
sort()function - A few changes to
!noiseto make it more useful (see docs) - Texture mapping attributes have all been renamed (old ones still supported)
- Texture sampler properties can now be controlled on a
!materialnode - A completely new, saner UV mapping for
!box - New
cross()anddot()product functions - Support for keystone transformations in
!transformwindow nodes - Can now provide arbitrary ffmpeg codec options on a
!recordnode !adjustnodes 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
- Faster nested CSG operations
Bug fixes:
- Fix spherical UV 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
- 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_kscodec at the moment)
Plus the usual bevy of tweaks to the documentation.
Full Changelog: v1.0.0b18...v1.0.0b20
v1.0.0b18
Fairly big release this time.
This release contains the following user-visible changes:
!electrostaticand!gravityforces now become constant when particles overlap to avoid unstable massive forces- The
!materialocclusion=attribute has been renamed toao=to make it clear that this is ambient occlusion !adjustnow supports acolor_matrix=attribute for supplying a 3x3 matrix to apply to the RGB channels- Unused
!noisechannels are now filled with1 !physicssimulations can now use a new!groupnode to control more precisely which forces apply to which particles. This is useful for reducing the computational complexity of large simulations.!dragsupports a newflow=attribute for giving a flow velocity of the pretend medium- A new
!fieldforce 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()andoklch()functions (both of which produce linear-sRGB colours) - We can now ask macOS to use the sRGB colourspace for windows iff the
pyobjcandpyobjc-framework-Cocoapackages are installed (these are now optional dependencies that can be installed withpip install flitter[macos] - New
infandnanconstants were added to the language - The
gammaattribute has been removed from all window nodes except!adjustand the--gammacommand-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:reinhardand:acesfunctions implemented !adjustalso has newshadows=andhighlights=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
!flarefilter has been added and, with it, new support for downsampled shader passes and a completely new texture/framebuffer pool-based architecture - New
shadows=andhighlights=attributes for!adjustfor doing exposure adjustments on the dark or light parts of images - Window
!transformfilter nodes now apply attributes in order like in!canvas3d
It also contains the following, less visible, improvements:
- The physics simulation of
!barrierreflections has been improved significantly !randomforces 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.modelsmodule 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
!differencewith 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
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
!transformfilter node for translating, scaling and rotating window nodes - New
!vignettefilter 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 – thebeta()andnormal()variates based on this are also extended- The
sample()function now returns an RGBA 4-vector - Addition of
run_timeandframeglobal names !videonodes have newtrim=andback_and_forth=attributes for controlling trimming and looping backwards- New algorithm for computing
!spheremeshes that generates half as many faces, with more even sizes - New
quaternion(),qmul()andslerp()built-in functions for making and manipulating quaternions - The
rotate=attribute of 3D!transformnodes now accepts a 4-vector unit quaternion for specifying arbitrary rotations
Full Changelog: v1.0.0b16...v1.0.0b17