NeutrinoParticles Editor 2.0.22

28-10-2026 15:10:51

2.0.22 - 2026-10-28

  • A new value type in the Emitter Guide: Emitter Velocity. Next to Emitter position, any 3D value can now read the velocity of the emitter itself — the direction and speed it moves with, zero while it stands still. Use it in combined values: particles that inherit only part of the emitter's motion, a trail stretched along the way the emitter flies, a force or wind that grows with the emitter's speed. It exports to JavaScript, C# and the GPU renderer.

  • Approx Rate and Approx Distance now look the same in the CPU preview as on the GPU. Both generators produced an even stream on the CPU (a particle exactly every 1 / rate seconds, or every so many units of travel), while GPU33 produces them at random moments around the same average. Now the CPU preview and the JavaScript 1.1 and C# 1.2 exports produce them the GPU way: the average amount is the same, the moments (or the points along the way for Approx Distance) are random, so the stream looks organic. A particle due while the emitter is full is not produced and is not made up for later, as on the GPU — Approx Rate no longer waits for a free slot as described for issue #426 (Periodic still does). At the rate the life link sets the emitter therefore usually holds a little fewer particles than its capacity. For an even stream use Periodic, EvenRing or By distance (issue #425).

  • Periodic and Approx Rate streams no longer skip shots when the emitter is full. At the rate the life link sets (100 / life) the particles in flight fill Max. num. particles exactly, so each shot needs the slot of a particle dying at the same moment; the shot used to come first and was dropped. For example, Periodic with capacity 10, burst 2 and a 10 s lifetime lost every sixth shot from the tenth second on. Now a particle that dies in a frame frees its slot before the shots, and a shot that still finds no slot waits for one for at most a frame, or 1% of the time the rate takes to fill the capacity — in the CPU preview and in the JavaScript 1.1 and C# 1.2 exports (GPU33 does not support Periodic; its Approx Rate is unchanged). An emitter whose rate asks for more than its capacity now emits whenever a slot frees within that time. In those exports the particles that were already alive are updated before the shots of a frame, so a Periodic or Approx Rate effect with a fixed seed may look slightly different after re-export (issue #426).

  • An EvenRing emitter attached "On terminate" fires again with the GPU renderer. Since 2.0.21 such an emitter with Start delay 0 and Start phase 1 never showed a particle in the GPU preview when its parent died, while the CPU preview was fine. Its first shot now fires on the frame the parent dies, at the parent's last position.

  • Fixed an emitter attached On terminate starting without its parent's velocity in the CPU preview: Add emitter's velocity (and the new Emitter velocity value) gave zero there, while the GPU preview carried the parent's motion over.

  • Fixed a crash after deleting Manual Keys shots on the timeline. With the generator's properties open, deleting keys on the timeline left their rows in the Properties panel; moving one of the remaining keys afterwards crashed the editor. The Properties panel now follows the shot count changed on the timeline, and deleting keys there can be undone in one step. Adding a key on the timeline with Shift+click or a double-click without moving it now also updates the Properties panel and the preview right away and can be undone; before, nothing changed until the next edit. Pressing Delete while dragging a Manual Keys key is now ignored until the drag ends; it could crash the editor. A timeline drag of a generator — Manual Keys keys, or the start and end boundaries of Approx Rate, Periodic and EvenRing — interrupted by undo or by the effect reloading from disk is dropped instead of writing its values into the reloaded effect.

  • Fixed Loop on the timeline not restarting the GPU preview once the effect ran out of particles. It depended on timing, so it hit long effects most often — for example Approx Rate with Limit by time. Loop also fires again on every run when Preview Start is set later than the effect start, on both the CPU and the GPU preview; before, it fired only the first time.

  • Fixed a crash when opening a mirrored effect whose source cannot be loaded. If the effect a mirror reflects was corrupted or saved by a newer editor, opening the mirror crashed the editor. The mirror now opens as it was last saved, the same as when the source file is missing, and follows its source again once the source is repaired.

  • A repaired effect opens on the next double-click. After an effect failed to load, double-clicking it again once its file had been fixed left the editing panels empty until another effect was opened in between. It now loads again.

  • The color dialog no longer shows a stray Apply, Reset or second Cancel button. Now and then the color picker of the Emitter Guide, the preview background, the scheme and the graph editor showed an extra button next to OK and Cancel, left over from the dialog's default button set; it did nothing useful. The leftover buttons are now removed before the dialog opens.

  • MCP: an effect that fails to load is reported as an error. effect_open used to answer as if the effect were open; it now returns an error naming the reason (a corrupted file, or one saved by a newer editor). project_list_resources marks such effects, and effect_save, undo and redo refuse them instead of reporting success or an empty undo history.

  • MCP: a preview screenshot is reported as ready only once the frame is on screen. With the GPU renderer, preview_scrub and preview_screenshot with a time used to wait a fixed second and answer settled:true while the preview was still catching up, so an agent got an empty frame marked as ready. Both tools now wait until the preview has actually painted the requested frame, on either renderer, and answer settled:false when it did not get there in time. preview_state and every preview answer now show what the viewport displays (displayedTime, displayedFrame, displayCaughtUp), so an agent can tell a frame still catching up from the one it asked for (issue #419).

2.0.21 - 2026-10-22

  • Fixed the GPU preview of a texture Grid with a fractional frame index (for example a random value in [0; 4)) showing a shifted cell instead of a whole frame. The index is rounded down to a whole cell again, as in the CPU preview.

2.0.20 - 2026-10-21

  • New: Attractors — zones that pull, push and swirl particles. The scheme has a new Attractors block (Functions → Move): place spheres, cylinders and paths in the preview and give each one a pull toward or away from its core, a swirl around its axis and a flow along it, with a dead core in the middle and a falloff to the edge. Feed the block's output into a ForceMove as a force or as a wind — a tornado, a vortex drain, a magnet. Edit the field right in the preview: one button per attractor type (in a front, side or top view a new attractor appears in the middle of what you see: a sphere or cylinder with its axis pointing into the screen, a path running left to right), the gizmo to move, rotate and scale, handles for the radii and the length, and the property panel for exact values, position and rotation included. While you edit, every attractor shows its field: white streamlines with arrows for the swirl and flow, and green or red arrows for the pull toward or away from the core; a negative fixed Strength turns them all around. Show visualizer draws faint wireframes of the attractors while you are not editing them. Exports to JavaScript v1.1, C# v1.2 and the GPU renderer. You can also skip the scheme: in the Emitter Guide, with Movement set to Forces, Add Force... and Add Wind... now offer Attractors. A new entry starts with one sphere at the center of the world, sized to your project and already pulling particles in, so you see it work at once; its row has a Strength that scales the whole field (random, curved or combined like any other value), Edit attractors... to open the block's editor in the preview, and Show visualizer. A Path is a tube through keys you place in the preview, with its own radius at every key, so it can widen and narrow along the way — pull draws particles to its centerline, swirl spins them around it, and the flow carries them along it from the first key to the last, turning smoothly round its bends (where the path passes close to itself or crosses itself, the parts blend the same way). Drag a key to move it and its radius handle to resize the tube there. Hold Shift over the selected path to see where a new key would go — on the tube's centerline at the nearest segment, or past a free end to extend the path — then click to insert it, keeping the button down to drag it straight into place (one undo step; Esc takes the insert back); double-clicking the tube puts a key in the same place, inserted at once without the drag. Use Add key to add one after the selected key or at the end, press Delete to remove a key, and Closed joins the last key back to the first. The gizmo moves, turns and scales the whole path. The GPU renderer takes up to 16 attractors and 256 path segments per block.

  • Every generator setting is now in the Emitter Guide. The Generation section shows all numbers of the chosen generator — start delay, start phase, burst, time and shots limits, period settings of Manual Keys — as regular values: a fixed number, an emitter property, a graph over the emitter's or the effect's time. The time and shots limits are on/off toggles side by side, and a limit's value shows only while the limit is on; the burst position is picked with two buttons, Normalized and Linear, each with its own tooltip, and the timeline visualizer is a toggle on the section's title bar (for the generators that have one), so the "Other generator's properties…" button is gone. Values the generator expects to stay constant — start delay and start phase, every EvenRing setting, the Manual Keys start time and periods — are marked (const), and their tooltips say why; Manual Keys keeps an Edit keys… button for its key table, with its Looped toggle on the same line. The rate of Approx Rate and EvenRing can go above 100 %, as in Periodic.

  • Switching the generator type keeps your settings. Moving an emitter from Periodic to Approx Rate or EvenRing (or back) now brings the rate, start delay, time and shots limits, start phase and burst along — whole values, graphs included — instead of resetting them. Settings a type does not share come back from what you last set in that type.

  • The rate can follow the particle life. A link button on the Termination title bar ties the generator rate to the Max Lifetime value: 100 / mean life for Periodic and Approx Rate, 100 / maximum life for EvenRing, with Fixed, Random and Graph lives. New emitters start linked; effects saved before open unlinked. If the setup stops allowing the link (a generator without a rate, a second Max Lifetime terminator, a life the link cannot read), it turns itself off and the editor tells you why.

  • A new Condition terminator in the Emitter Guide. The Termination section can now hold a Condition terminator next to Max Lifetime and Path: it compares two values, A and B, every frame and kills the particle as soon as A reaches B. Both are full Emitter Guide values, so A can be, for example, the X of the particle's position (a multi-value with Particle Position and the expression x(a)) and B a fixed number — an axis-aligned border that costs much less than a terminator path. Add as many as you need; a new one starts with A = 0 and B = 1 and terminates nothing until you change it. Mirrored emitters, copy and paste, and undo work as for the other terminators.

  • See other graphs while you edit one: graph visualizers. When a particle's size, transparency and movement all change at the same moments, their keys had to be lined up by switching between graphs again and again. Now any graph can be pinned as a visualizer — with the pin button in the Graph Editor's title bar, or in a Curves block's properties — and its outline stays visible, faded and read-only, while you edit any other graph of the effect, from any emitter that is turned on. Hover an outline to see its name, its emitter and what its horizontal axis is next to the mouse; click one to jump to editing that graph. Show visualizers in the title bar hides them all for the session, and its arrow lists every pinned graph in its outline color: click one to open it, or unpin it with the button next to it. Switching graphs from inside the Graph Editor keeps the view where it is. The Graph Editor no longer goes blank when no graph is selected: it shows the pinned graphs alone, fitted into view, ready to be clicked. Graphs made by the Emitter Guide now carry a name after what they belong to (Size / Start, Transparency, a custom value's name), also shown on the Curves block in the scheme and, with what its horizontal axis is, in the bottom-left corner of the Graph Editor; a Curves block added by hand can be given its own name. The Curl Noise Show visualizer checkbox became an icon toggle.

  • A child emitter can pick up exactly where its parent particle ended. Values in the Emitter Guide can now read what another section currently computes for the particle: the value type menu offers EG: Size, EG: Color, EG: Transparency, EG: Rotation and EG: Texture frame, each with the icon of the section it reads. The main use is an emitter attached with On terminate: set its size or color parameter to EG: Size or EG: Color and an explosion, a splash or a trail starts at the size and color the particle had when it died, with no visible jump. With OnInit on, the child gets the values the parent had when it was born instead. An entry is offered only where it can work: the section exists in the current geometry, its output fits the value's dimension, and it is computed before the value, so two sections can never read each other; a random color or transparency counts, since it is drawn once when the particle is born. If a section later stops providing the output, for example when a 1D value reads the size and you switch the size to Rectangle, the value goes back to its default type by itself. EG: Rotation follows the rotation mode: it is the angle while the rotation is Faced and the full rotation (an R value) in Free, By velocity free and From axes, for both quads and stripes, so a quaternion parameter of an attached emitter can carry the particle's exact orientation into the child. The effect exports the same way to JavaScript, C# and GPU33. On GPU33 the value comes from the last frame in which the parent was alive, which can be up to one frame before it died, so a section that changes quickly at the very end may leave a small step.

  • An attached emitter can take over its parent particle's orientation. Emitter property is now offered on R (rotation) values too, as a quaternion property edited as an axis and an angle in degrees. The main use: set the child's Self Rotation to an Emitter property named after the quaternion parameter the parent hands over with EG: Rotation, set the child's Rotation to Self, and its particles start turned exactly like the parent particle was when it died. The property is exported to JavaScript, C# and GPU33 like the other emitter properties, so a game can also set it from code.

  • Editing an effect with a large painted Area no longer freezes the editor for seconds with the GPU renderer. The GPU preview rebuilt the whole area into its shaders on every change, and the graphics driver needed several seconds to compile it, longer the bigger and softer the painted area (issue #415). The area is now passed to the GPU as data: in a client's effect a change takes as long as with no area at all. Particles are placed exactly as before. Effects with a large area exported for GPU need the updated GPU runtime packages.

  • Exporting no longer silently drops emitters. When the export target cannot take an emitter — for example a Points or Grid block exported to JavaScript 1.0 or C# 1.0/1.1 — the export window now lists each left-out emitter with the reason and stays open, while the rest of the effect is exported. When nothing exportable is left (every emitter rejected or disabled), the item fails with the reasons and the previously exported file is kept, instead of being overwritten by an empty effect (issue #386). Agents driving the editor over MCP get the same information per item in the excludedEmitters field of effect_export.

  • The editor warns when a generator's Burst is larger than the emitter's Max. num. particles. One shot cannot fit into the emitter then: the extra particles of every burst are never emitted, Burst Pos. never reaches its end, and with the GPU renderer an EvenRing emitter used to show nothing at all. Now the generator block gets an amber outline in the scheme and the emitter row an amber sign, both explaining what to change. It is a warning, so the effect still exports. It covers Periodic, By distance and EvenRing generators whose Burst is a fixed value. With the GPU renderer such an EvenRing emitter now renders: every free slot of the emitter fires once per shot, and for a whole-number Burst the shots follow at the same pace as on the CPU.

  • The painted area steps back when you leave the preview. While you edit an Area block, its checkerboard used to cover the particles it produces, so checking the result meant deselecting the block. Now the checkerboard and its border fade to a quarter of their strength as soon as the mouse leaves the Preview window, and come back as it returns, both within a third of a second. The brush circle no longer stays frozen at the edge of the viewport when the mouse leaves: it disappears and returns with the next move.

  • A graph's Shift remembers its setup when you turn it off. In the Emitter Guide, turning off Shift on a Graph or Over Value and then turning it back on used to throw away everything you had set up in it — rows, their types and values, the expression, nested levels — and start again from a single random row. Now the Shift comes back exactly as you left it, also after saving and reopening the effect, and on mirrored emitters. If something it used is gone by then — a custom value you deleted, or particle speed the movement no longer offers — that row falls back to its default, the same as when pasting a value.

  • The Graph Editor's buttons moved into its title bar. Like the Timeline, the Emitter Guide and the Emitters window, the Graph Editor now keeps its buttons in the window's title bar, next to its tab, and the graph gets the whole height of the window. Buttons with nothing to work on stay hidden as before: loop with a graph open, key types with keys selected, segment types with segments selected. The buttons got new icons in the style of the rest of the editor.

  • The timeline no longer slows the editor down when zoomed out. With many seconds of the timeline in view, drawing the particle count graph could take most of the editor's time, especially for effects whose count jumps up and down — bursts that empty out between shots — so the whole editor stuttered, even with the preview paused. The graph is now drawn many times faster and is not redrawn at all while it stays the same, so the editor stays smooth at any zoom. The graph looks the same as before.

  • Export warnings and errors are shown in the interface language. The explanations on the amber and red outlines of scheme blocks and on the signs of emitters and effects used to be English only; they are now translated like the rest of the editor. The same message reported by several export targets is listed once.

  • Effects saved with this version do not open in older editor versions: the saved Emitter Guide data changed (it now stores the rate link and the new terminator type), and an older editor reports that the file was created by a newer version.

  • The shot ticks of an EvenRing generator no longer drift away from the particle-count graph. The comb of small ticks marking each shot used a period about 2 % shorter than the one the generator really fires on, so the ticks ran ahead of the shots — by about a second after 50 seconds. They now use the same period as the preview, including the small safety margin every renderer adds to the ring, and with the GPU renderer they also follow its whole-shots-per-ring arithmetic, so each tick stays within a frame of its shot. Switching the renderer in the project settings updates the ticks right away.

  • The shots limit of an EvenRing generator works on the GPU renderer. With a Start phase below 1 or a Start delay, the GPU preview and GPU exports fired fewer shots than Limit by shots allows — a limit of 5 with start phase 0 fired only 3, a limit of 1 fired none. They now fire every allowed shot, as the CPU preview does. Re-export GPU effects that use this combination.

  • EvenRing streams no longer have gaps from a late slot reuse. When particles lived only a few frames, a part of the shots never appeared, in waves: a particle that died in a frame freed its slot only for the next frame. Now the slot is freed before the generator shoots — in the preview on the CPU and on the GPU, and in the JavaScript 1.1, C# 1.2 and GPU33 exports. On the GPU this needs EvenRing to be the emitter's only generator and the emitter to have no attached emitters of its own. The GPU fixes also cover shots at the end of the ring, shots on the boundary of two frames in emitters that are not attached (the first shot after a start delay of a whole number of frames), and the time and shots limits, which now count shots as on the CPU. The GPU33 clock no longer drifts or stops on long runs. To avoid gaps from late slot reuse, use rate = 100 / lifetime (the life link does it), frames shorter than the lifetime, fixed timing inputs and a whole-number burst that divides Max. num. particles. Particles whose attached emitters are still running keep their slots, so shots can still be lost. On the GPU an effect running for hours without a restart can still lose a few shots. On the CPU the particles that were already alive are now updated before the shots, so an EvenRing effect with a fixed seed may look different after re-export (issue #416).

  • A looped Manual Keys generator shoots in every period again in the preview. The CPU preview and the JavaScript 1.1 and C# 1.2 exports skipped a key that had already fired, so a looped generator with one key shot only in its first period, and a frame that passed several keys shot only the last of them. Every key now fires once per period. If the emitter is full when a key fires, the particles it could not shoot are added to the next key's shot.

  • No start flag on the timeline for a start that is not a constant. When an input in the scheme drives a generator's start delay (the start time of Manual Keys), or its Emitter Guide value is anything other than a fixed number, the timeline used to keep a dimmed Gen Start flag at a time that meant nothing. The flag and its line are gone now, and dragging the end of the generator no longer moves that hidden start along.

  • Max Lifetime now ends a particle on the frame its lifetime reaches the value. Before, the JavaScript 1.1 and C# 1.2 exports and the preview kept the particle alive for that one frame when its lifetime landed exactly on the value, while GPU33 already removed it. These exports now agree; the legacy JavaScript 1.0 and C# 1.0/1.1 exports keep the old behaviour. The difference shows only when the lifetime hits the value exactly, so most effects look the same.

  • MCP: an Emitter Guide override on a mirrored emitter can now be seen and discarded by an agent. The field's container reports overridden and offers a discard action that works like the hover button, as one undo step (issue #387).

  • AI agents can change a custom value's dimensions. Through the MCP server, choosing 1, 2 or 3 in a custom value's dimension menu in the Emitter Guide was reported as done but changed nothing. It now works as it does with the mouse, and so do the preview's Hide visualizer and renderer menus.

  • AI agents can open emitter and effect properties and use the quad origin picker. Through the MCP server, selecting an emitter only made it the active one and an effect could not be selected at all, so an agent could not reach their properties, although the editor told it they were there. Selecting an emitter or an effect row now does what a click does: its properties open (the effect's row also becomes the selected one for its menu). The quad origin picker, which has no buttons, can now be driven by an agent: it sets the origin by coordinates and closes the picker, as dragging and Esc do. The picker's coordinates and frame number are now translated in the Chinese interface as well.

  • AI agents can no longer press controls hidden behind an open dialog. While a dialog such as "This effect was changed on disk — reload it?" was waiting for an answer, an agent connected through the MCP server could still use the menus and buttons of the main window behind it — something a person cannot do. Choosing Refresh from disk that way started a second refresh on top of the first one. An agent now gets the same answer a person would: only the open dialog can be used until it is closed.

  • Closing the editor from an AI agent no longer crashes it. When an agent connected through the MCP server asked the editor to close and an unsaved effect raised the "save changes?" question, the agent was not told that the editor was waiting for an answer — and if it stopped waiting, answering the question then crashed the editor. The agent is now told within its waiting time that a question is open, and the editor closes or stays open cleanly whatever the answer.

  • AI agents can create emitter-level properties and reach an emitter's own settings. Through the MCP server, the block palette listed the emitter-level Custom property blocks under the same names as the particle ones, so an agent asking for one always got a particle property; they are now addressed as EmitterProperty, EmitterProperty2, EmitterProperty3 and EmitterPropertyR, each palette entry also names the block it creates, and a name shared by two different blocks is refused instead of silently picking the first. Selecting an emitter's row in the Emitters window from an agent now also shows that emitter's properties (standalone, maximum particles, …) in the Properties panel, exactly as a click does, and selecting the already active emitter brings them back instead of failing.

  • The preview no longer fails on effects whose particles can live for zero seconds. With Max life coming out exactly 0 (for example set to the Number of Shots, which is 0 on the first burst) and a Manual movement along a path, the CPU preview stopped with "CPU renderer init failed" and repeated the error every frame. Paths, graphs, grids and texture-grid indices now treat the undefined life of such a particle as the start of their range, in the preview and in the JavaScript v1.1, C# v1.2 and GPU exports (the older JavaScript v1.0 and C# v1.0/v1.1 exports are unchanged).

  • Collision values survive switching collisions off and on. In the Emitter Guide, after collisions were switched off and on again, the Radius, Restitution and Friction values that were not plain numbers (random, a graph, the particle speed and so on) were left disconnected from the scheme, so the effect collided with the block's default values instead; the development build of the editor closed at that moment. The same happened when the effect was saved with collisions off and they were switched on after reopening it. The values are now reconnected, and a mirrored emitter follows them.

  • Fixed a possible crash when changing a value from Num. particles. Changing an Emitter Guide value from Num. particles to a type that stores its result at spawn (for example Random in an Update row) could close the development build of the editor when that value was the last one using the particle count.

  • The Emitter Guide of every mirrored emitter is read-only. A mirror takes its shape from its original, and the Emitter Guide already locked its controls on a mirrored emitter — but not on an emitter inside a mirrored effect, nor the Apply emitter's rotation switch of the Manual movement. There, a change looked applied and was then overwritten (or left the mirror out of step) at the next update from the original. These controls are now locked as well, and the editor refuses such a change even when it does not come from the controls, for example from an AI agent. Settings that a mirror may override, such as the start velocity options, stay editable as before.

  • The properties of a mirrored emitter follow its original. With a mirrored emitter selected, changing the original (for example its maximum number of particles or its sorting) left the Properties window showing the mirror's old values until another emitter was selected. The window now updates right away, including the rows that appear or disappear with a mode, such as Max age for an age sorting; the effect's own properties do the same when they change outside the window.

  • Switching the movement back to Manual no longer breaks its points. In the Emitter Guide, when the movement was switched away from Manual and the particle life changed meanwhile (for example a second Max life terminator was added), switching back to Manual left its point distribution reading the particle life that was no longer there, so it was not connected in the scheme, and the development build of the editor closed at that moment. The distribution now switches to the particle time, as it does when the life changes while Manual is on.

  • Fixed a possible freeze of the emitter scheme. A block with more connectors than fit around its outline could make the scheme spend minutes laying them out; the connectors now simply stay overlapped.

  • Fixed a crash when collapsing a nested value row under an expression. In the Emitter Guide, with a value in expression mode (several rows combined by an expression), turning one of its rows into a nested multi-value and then collapsing that nested level back with its S button crashed the editor, and the crash could repeat on the next start from the auto-saved effect. The collapse now works, and an effect whose nested row has lost its output is reported as invalid instead of crashing.

  • Fixed a broken color row after changing its size. In the Emitter Guide, switching a color row of a multi-value (for example the Color section's own row, or a color pasted into another row) to 1D or 2D left the row half-changed: it still looked like a color and could break the effect or its mirrored emitters. The row now becomes a plain value of the chosen size and keeps its numbers; switching back to 3D gives a plain 3D value, and undo brings the color back. An effect saved with such a half-changed row is repaired the same way when you open it.

  • An expression of the wrong type no longer locks an Emitter Guide section. When a multi-value's expression returned another type than its value needs — for example a 2D row in the Color section, or vec2(a, a) for a number — the whole section could become greyed out after the next edit or after reopening the effect, and stayed that way even once the expression was fixed. The section now stays editable: the expression field turns red and its tooltip says which type it returns and which one is needed, the effect does not export until it is fixed, and the value stays connected, so fixing the expression — in the Emitter Guide or on its block in the scheme — is all it takes. This applies to every Emitter Guide value that takes an expression (size, rotation, texture frames, positions, forces, custom values and the rest). Effects that were saved in the locked state are repaired when you open them.

  • Expression blocks can pin their output type. The Expression block in the emitter scheme has a new Output type property: Auto (the output takes whatever type the expression returns, as before) or a fixed Float, Vector2, Vector3 or Rotation. With a fixed type the block keeps its connections when the expression returns another type; the block is marked as invalid instead, and its tooltip and the emitter's error sign say why. The Emitter Guide sets a fixed type on its own expressions; effects saved by earlier versions get it when you open them, without being marked as modified.

  • Groundwork against crashes after undo, reload and discard. The editor is moving to reference-counted model objects, so a window still showing an effect that was just reloaded, undone or discarded can tell the effect is gone instead of reading freed memory. A panel that outlives its effect stops with a clear log entry rather than misbehaving silently, which makes such problems far easier to trace. The preview scene is now fully on the new model: the scene list, the scene object properties and the moving-object track simply skip a scene or object that is gone. So are the emitters of an effect: the emitter list, its context menu, drag and drop, copy and paste, and the texture and color actions skip an effect that is gone, and the scheme's slow-tick diagnostics can no longer mistake a reloaded effect for the old one. So are the blocks of the scheme: the scheme view, the block properties, the frame editor and the timeline's generator markers skip a block that is gone. Along the way, the pin and "create updater" buttons of a block no longer act on a stale block after undo; inserting a block type that is already in the scheme from the block picker now adds a new block, where before the second one never appeared in the scheme; and a quick run of undo or redo no longer risks a crash when the preview's error check reads an effect that was just replaced. The Emitter Guide's values are now reference-counted as well, both their implementations, the value rows themselves and every multi-value holding them, and so are the guide's sections with their modes, forces, terminators and attached emitters; along the way, nesting a value row can no longer lose the row's value if the nested level fails to build. The guide's value editors are on the new model too: a number field, slider, color picker, type menu or copy and paste that fires after an undo or a rebuild of the guide skips a value that is gone instead of reading it. Along the way, paste can no longer land in a different row than the one the editor shows, the color picker no longer writes into a value that an undo replaced while it was open, a graph editor no longer pops open for a value whose type was changed again right away, and collapsing a nested row no longer acts on the guide rebuilt in the meantime. The guide's Generation, Termination, Starting Position, Movement and Starting Velocity sections follow: a mode button, a terminator, force or wind button, or an add menu or confirmation that comes in after an undo or a rebuild of the guide skips what is gone instead of acting on it, and a section whose mode was replaced by a new one of the same kind picks up the new one. So do the Geometry sections — size, rotation, color, transparency, origin, texture and their Strip counterparts — and Self Rotation; along the way, a mirrored emitter whose original switched its geometry mode away and back no longer reads the geometry the switch replaced, and the texture picker, the origin picker, the frame editor and the atlas link no longer apply their result to a guide that was rebuilt while they were open. So do the collisions controls and the noise and curl forces and winds; along the way, the curl variant and visualizer controls of a force now notice when the force is gone, as they already did for a curl noise value. So do the custom values and attached emitters sections and the guide itself: a button of a value or attached emitter row now acts on its own item even if the list changed behind it, and the emitter picker, the dimension picker and the name prompt of a new value drop their result, instead of applying it, when the guide is rebuilt while they are open; so do a group's Copy, Paste and preset actions picked from its menu. After an undo, a block's red or amber error outline in the scheme stays on that block, where before it could briefly land on a different block. A path's Generate dialog and an area's Load Picture dialog no longer crash or write into the block when its editing ends while they are open (another block selected, the block deleted or the project closed), and closing a project no longer risks a crash when the project panel is refreshed right after. The properties panel is on the new model as well: after an undo, redo or reload it is rebuilt on the restored block, emitter or effect, and an edit, revert, connector click or editor button that comes in before that is ignored instead of writing into the replaced object. Along the way, editing an effect's or an emitter's properties after an undo no longer writes into the version the undo replaced (where the edit could be lost or crash the editor).

  • Clicking a control point in the preview no longer nudges it or rebuilds the effect. Pressing a control point of a collision surface, a grid corner or an attractor used to start dragging it at once: the tremor of the click moved it a little, and even a click that moved nothing saved a change and rebuilt the effect. The point now follows the mouse only once it has moved a few pixels; a plain click just selects it. If the editor window loses focus in the middle of such a drag (switching to another application), the drag is cancelled and the point goes back where it was.

  • A new By value angle graph no longer loops at the end of the particle's life. The graph a rotation got from By value was set to repeat past its end. While the particle lives that changes nothing, but on its very last update the angle wrapped back to the start of the graph, so a child reading EG: Rotation on termination received the starting angle instead of the final one. New graphs now stop at their last key; graphs saved earlier keep the loop setting they have (turn it off in the Graph Editor if a child should pick up the final angle).

  • A Free rotation now follows its By value angle change. With the quads rotation set to Free (or the stripes rotation to Free) and the changing angle set to By value, the graph was ignored: the particle turned by its starting angle only, while the same graph worked in Faced. The graph now drives the rotation in Free as well. Steady was never affected. Effects saved earlier with this setting pick up the change when they are opened, so a Free rotation that was meant to turn over the particle's life now does.

  • Undo no longer leaves the error check of an effect looking at the old effect. Undoing a change that does not rebuild the effect — switching Show visualizer, pinning a graph — kept the effect's error checks (the red frame in the preview, error marks in the scheme and the project tree) tied to the version from before the undo, which could show wrong errors and, at worst, crash the editor. The checks now follow the undone effect, and the preview keeps playing as before.

  • Fixed a crash when opening some older effects with mirrored emitters. An effect made in an older version of the editor, whose mirrored emitters use time or life curves from that version, could crash the editor right when it was opened. Such effects now open normally, and every mirror shows and exports the same as its original.

  • A mirrored emitter's color follows its original when an expression is switched on. Turning on an expression for the Color of an emitter left its mirrors with the color baked in as before, so a mirror could lose its color in the preview and in export. Mirrors now switch along with the original, in both directions, including a scale multiplier (S) set only on the mirror. The mirror's Color section no longer shows as invalid, and turning the expression off on the original of a mirror opened from a file no longer crashes the editor.

  • Overrides on a mirror survive switching an expression on the original. A color, transparency or other constant you changed on a mirrored emitter could fall back to the original's value — or an old value could come back after you discarded it — when the original's value switched between a plain number and an expression. The mirror now keeps exactly what you set, and discarding still brings back the original's value.

  • A value you changed on a mirrored emitter survives a replacement of the original's block. When the original emitter rebuilt the block behind a constant that is driven by an expression (for example after pasting a value into it), a mirror of that emitter showed and exported the original's number instead of the one you had set on the mirror. The mirror now writes its own value into the rebuilt block.

  • A mirrored emitter's axis-and-angle rotation works with a multi-row axis, and keeps what you set on the mirror. A mirror of an emitter whose Self Rotation is set as an axis and an angle stayed invalid as soon as the axis had more than one row, and a value you set on the mirror for the angle or the axis was replaced by the original's on every synchronisation. The mirror now follows the original and keeps its own values, and discarding them brings the original's back.

  • The angle of an axis-and-angle rotation is in degrees everywhere. A Self Rotation set as an axis and an angle read the angle in radians while it was a plain number, but in degrees as soon as the angle or the axis was switched to a random value, a graph or an expression, so the particle turned about 57 times more — or less — than before the switch. The angle is now degrees in both cases, like every other angle in the editor. Effects saved earlier keep the rotation they had: a plain angle is converted to degrees when the effect is opened (1 becomes 57.3), while an angle that was already fed through a block keeps its number.

  • A color used in an expression always has its scale multiplier in the scheme. When the Emitter Guide feeds a color into an expression, the Emitter Scheme now always shows the multiplier blocks next to the color, even with the scale (S) at 1, instead of adding and removing them as the value changed. The effect looks and exports the same; effects made in older versions get the two blocks when they are opened.

  • No crash in the Graph Editor after a color graph. With Show color representation turned on, the editor could close when the Graph Editor moved from a three-curve graph to one with a different number of curves — opening another effect, selecting another graph, or changing a Curves block's output type. The color strip now shows only over a graph with exactly three curves and comes back by itself as soon as there are three again.

2.0.19 - 2026-10-07

  • Texture atlases with rotated sprites: the new Frames mode. Until now a texture could only be used whole or cut into an even grid, so a sprite sheet produced by a packing tool — irregular cells, some sprites stored turned on their side — could not be used as it was. In the Emitter Guide's Texture section, Frames takes a list of frames instead: each one is a rectangle anywhere on the texture, turned at any angle, and the particle's frame index picks which one it shows. Edit Frames... opens the frame editor: draw and drag frames over the texture, rotate and resize them with handles or type exact pixel values, cut the whole sheet into equal cells with Slice Grid... (numbered in the same order as the Grid mode, so switching over keeps your animation), and turn or mirror what a frame shows without moving it — the fix for a sprite the packer stored rotated. A preview shows the selected frame the way a particle will draw it. Every change shows in the effect's preview as soon as you pause, while the frame editor keeps its own undo: Cancel puts everything back, and OK lands the whole session in the effect as a single undoable step. On a mirrored emitter the frames can be edited too; they become that mirror's own, and discarding brings back the original's. TexturePacker atlases can be linked directly: type or pick the atlas .json in the new Atlas field (or use Link in the frame editor) and the frames, rotated and trimmed sprites included, come straight from the file, with the texture switched to the atlas image. The effect then follows the file — repack the atlas and the frames update within a second, each sprite keeping its index by name, so an animation does not scramble; a sprite that disappears leaves a marked gap instead of shifting the rest. A broken or half-written file is reported and changes nothing, exporting an effect always uses the atlas as it is on disk, and copying the effect to another project brings the atlas along. Import Once takes the frames without following the file, and Convert to Manual stops following it while keeping the frames.

  • Winds and a new kind of turbulence: Curl. The Emitter Guide's Movement → Forces section now holds two lists. Next to forces, which push particles directly, there are winds: a wind is a flow of the air itself, and particles are dragged along with it rather than pushed. Add one with Add Wind... — Directed, Curl or Turbulence (legacy); each choice explains itself when you hover it. A wind needs air resistance to act on anything, so adding one fills in a small Air resistance for you, but only while it is still zero: a value you set yourself is never overwritten. Effects made before this version keep their movement exactly as it was. Curl is a new turbulence you can pick from both lists, as a wind or as a force. Unlike the classic turbulence it has no spots that suck particles in or push them out, so particles swirl and flow around each other instead of bunching up — the look of smoke, water or a gust through leaves. A freshly added Curl starts with a strength matched to your project's scale rather than a near-zero one, and all four of its settings — Strength, Wavelength, Animation speed and Space offset — can be random, follow a curve or be combined like any other value. In the scheme the same field is the Curl Noise block. Curl is also a value type: any 3D value (a color, an offset, a velocity) can pick Curl Noise from its type menu and sample the field at a point you choose — by default the particle's own position. Curl exports to JavaScript v1.1 and C# v1.2 and runs in the GPU preview; the older export targets refuse such an effect with a clear error instead of producing a broken one. In your game the runtime needs the field before the first effect that uses Curl is created: GPU33 and the Unity package build it themselves, in MonoGame you generate it at start-up, and in JavaScript you either bake it or load the prebaked file from the Noise Generator page — each integration's documentation shows how. The classic turbulence — the Turbulence force and wind, the Noise value type and the Noise3 block in the scheme — is now marked as legacy: effects that use it keep working exactly as before, but for new effects use Curl.

  • Curl: 48 variants and a way to see the field. Every Curl wind and force, the Curl Noise value and the Curl Noise block in the scheme now have a Variant, from 0 to 47: each one swaps and flips the axes of the field, so it looks like a different field in the same place while staying just as smooth. Two Curl sources in one effect no longer have to move alike, and trying another look is one drag of a slider (in the scheme, a number). Variant 0 is the field as before, so existing effects do not change. A Show visualizer checkbox next to it draws the field in the 3D preview as streamlines — lines that follow the flow, blue at the tail and yellow at the head — over a cube at the center of the world, exactly one Wavelength wide. As the preview plays, the lines drift with the field without changing shape, and a line that reaches a face of the cube fades out there and back in at the opposite one instead of jumping. The checkbox only affects the preview: switching it marks the effect as changed but does not rebuild it, so the preview keeps playing. On a mirrored emitter both settings can be overridden like any other.

  • New: Points — particles placed exactly at points you set by hand. Pick Points as the type of a 3D value in the Emitter Guide (most usefully Starting Position), or add the Points block to the scheme, and place the points in the Preview window with the familiar path editor — without curves, every point is used exactly where you put it. Each particle is born at one of the points, never between them: lamps around a sign, sparks at the tips of a star, studs placed by eye. Mode decides how often each point is picked — Uniform gives every point the same share, Length weighted favours points that stand far from their neighbours. Feed the distribution from Emitter Time to light the points one after another, or use a burst with one particle per point. Generate offers the shapes of the path editor except Ring: the polygonal ones give their corners, and Ellipse, Spiral, Wave and Rounded rectangle ask for a Number of points and place exactly that many, evenly along the curve. Supported by JavaScript v1.1, C# v1.2 and GPU export; older runtimes report that the effect uses an unsupported block. Up to 1024 points per block.

  • The path editor shows how many keys the path has. While you edit a Path, TerminatorPath or Points block in the Preview window, the bottom-right corner of the preview shows the count of keys (points), and how many of them are selected — handy when the same number has to go into a burst size. The Path property of these blocks is now translated in the Chinese interface as well. Cancelling a Generate dialog now also puts the Closed button back to the state of the path.

  • A picture in the preview scene no longer hides block visualizers at the same depth. A picture, video or image sequence placed at the same depth as a path, area or other block visualizer (both sit at depth 0 by default) covered the visualizer as soon as you stopped editing the block. The visualizer now stays visible over it; a picture that is really closer to the camera still covers it, and particles are drawn as before.

  • Show visualizer no longer restarts the preview. On the Path, Points, Area, Grid, TerminatorPath and Collide blocks, switching Show visualizer used to rebuild the effect, so a playing preview jumped back to the start. It only affects what the preview draws, so now it just marks the effect as changed and the preview keeps playing — as it already did for Curl Noise and the generators. A block that is mirrored by a reflected emitter still rebuilds the effect when you switch it.

  • Long paths no longer slow the preview down while you are not editing them. While a Path, TerminatorPath or Points block is selected, the preview used to recompute the whole drawn line every frame, even when nothing changed; on a path with a thousand keys that cost a noticeable part of each frame. The line is now recomputed only when the path actually changes — still on every step of a drag. On a TerminatorPath the kill wall now follows a key while you drag it, instead of catching up only when you release the mouse.

  • AI agents now see the editor's notifications. The messages that pop up in the corner of the window — a failed video, a changed renderer, an export or update problem — used to be invisible to an agent connected through the MCP server, so it could report that something "failed silently" when the editor had in fact said why. The latest notifications are now part of what the agent sees of the editor, including those you have already closed, and whenever it looks at the editor it is told what changed since it last looked — so a message that arrives a few seconds after an action, while the agent is busy with something else, is no longer lost. What you see in the notification log under the bell does not change, and an agent reading the notifications does not mark them as read for you. If a second agent connects while the first one is still working, the editor now shows a notice that two agents are using it at once, since they may overwrite each other's changes.

  • Closing a project no longer occasionally closes the editor. Right after a project was closed, a file change in its folder — the editor's own save, or a sync client such as OneDrive touching the files — could arrive before the project was fully torn down, and the editor then read settings of a project that no longer existed. The project now stops watching its folder and cancels pending autosaves before it lets go of its data.

2.0.18 - 2026-09-30

  • Effects can now be exported as a sequence of images. A new Export Image Sequence button on the preview toolbar (also Windows → Export Images) opens a panel that renders the current effect frame by frame into numbered PNG files — ready for a video editor, a sprite sheet or an engine that plays image sequences. What you get is what the preview shows: the same renderer, bloom and background. A frame in one of the preview's planar views (Front, Top, Left and so on) marks the area to export; drag its edges or handles with the mouse to resize it (Shift resizes from the centre), drag inside to move it, or type exact values in the panel. Set the output size, the time range — or let it follow the preview range — the destination folder and the file prefix. Transparent background writes the images with an alpha channel for compositing, and Include scene objects decides whether pictures and image sequences placed in the preview scene end up in the images too (videos are not exported; the panel warns when the scene has one). Frames follow the effect's own frame rate. The settings are saved with each effect and can be undone like any other change. The render runs in the background with progress shown and can be cancelled; meanwhile you can keep working and even switch to another effect.

  • Right-clicking in the emitter scheme no longer closes the editor. A right-click on a block could end the session instantly right after its menu closed — reported after using "Reflect" on the Portal sample. While the menu (or a conflict dialog, or a drag) was open, the scheme view underneath it could be rebuilt, and the editor then carried on with the old, already discarded view. It now notices that and simply drops the click. If this happens again, the editor quietly sends a report that names what rebuilt the view, so the underlying cause can be fixed as well.

  • The macOS editor is now signed and notarized by Apple. Until now the macOS build came unsigned, so the first launch was blocked with "cannot verify the developer" and had to be allowed by hand in System Settings. The editor is now signed with the NeutrinoParticles Developer ID and checked by Apple, so it opens like any other downloaded application. The signature is also what macOS needs before it lets an application use some of its services, which is the root of the recent crashes when picking an image or a colour on macOS.

  • Updates on macOS are checked before they are installed. Before replacing the installed editor, an automatic update now verifies that the new version is signed by NeutrinoParticles and is the editor, and verifies it again after copying. An update that fails the check is not installed and the current version stays in place; if the old version cannot be put back, the message says where it has been kept.

  • The bundled Samples project is now read-only. Samples can still be opened, explored and edited — the preview, undo and all editing work as before — but nothing is written back: saving, creating, renaming, deleting and exporting are unavailable there, and closing it discards changes without asking. Previously changes went straight into the application's own folder, where an update could overwrite them and where, on macOS, writing breaks the application's signature. To keep and work on a sample, drag the effect from Samples into your own project: that makes an editable copy.

  • Undoing a change no longer sets up a crash on the next copy. If an effect held a mirrored emitter whose rotation section had lost its angle block in the scheme, pressing Undo (or restoring the effect from an autosave) rebuilt it in a state that looked consistent but was not, and the next operation that synchronised the mirror — copying emitters, for instance — ended the session instantly. Undo, redo and autosave restore now check each emitter's Emitter Guide against the blocks actually present before anything synchronises with it, so a mirror can no longer be pointed at a block that is not there.

  • Removing a value row no longer closes the editor when the emitter is mirrored. In an emitter that has a mirrored (reflected) copy, removing a row of a multi-row value in the Emitter Guide — the Starting size, for instance — could end the session instantly. When the row removed was the only one whose value varies per particle, the editor discarded the value it kept per particle but went on listing it among the emitter's particle properties, and the mirror then looked for a value that no longer existed. The list is now brought up to date once the change settles, and a mirror skips such a leftover instead of failing on it.

  • Copying and pasting emitters is now recorded in the editor log. These two operations left no trace at all, which made a recent series of crash reports look like something else entirely. The log now names what was copied and when a paste started and finished, so such a report can be read correctly.

  • On macOS, choosing an image or a colour no longer closes the editor. Clicking the button that picks a file — adding a texture to an effect, for instance — could end the session instantly, sometimes after the system complained that "the open file operation failed to connect to the open and save panel service". macOS draws those panels in a separate system process, and recent versions refuse that connection to an application they cannot verify; the editor was then shut down by the system before the panel ever appeared. The editor now draws its own file, colour and font pickers on macOS, which need no such connection. They look slightly different from the system ones, and will go back to the system panels once the now-signed build is confirmed to open them on the latest macOS. Windows and Linux are unaffected.

  • Opening certain older effects no longer closes the editor. An effect containing a mirrored (reflected) emitter whose graph came from an older version of the editor could end the session the moment you opened it, with nothing saved and nothing on screen explaining why. While loading, the mirror was asked to connect a graph it had not received yet — the copy takes its graph from the original, which happens a moment later. The editor now waits for that moment instead of giving up. The effects themselves were never damaged and need no repair: they simply open now.

  • A busy --mcpServer port now fails the launch instead of starting quietly on another one. When the port given on the command line was already taken — typically by a second editor — the MCP server stayed on the port saved in Editor Settings, so the editor answered somewhere nobody had asked for and an AI agent could end up driving the wrong editor. Passing the switch means that port, so the editor now refuses to start, prints the reason and exits with an error. Launching without the switch, or with a free port, is unchanged.

  • The Emitters list now shows each emitter's texture. A small thumbnail sits next to the emitter's name, so a multi-emitter effect can be read at a glance — which is usually what tells two emitters apart, more reliably than their names. Hovering the thumbnail shows the texture enlarged, for when the small version is not enough to tell two similar ones apart. When the emitter is the selected one, clicking either the thumbnail or the enlarged preview opens the texture picker directly, instead of going through the Emitter Guide's Texture section. The Emitter Guide's Texture section now shows the same picture next to the path, for quads and for strips alike. Right-clicking an emitter — or that preview — offers Reveal texture in file manager, which opens the texture's folder with the file selected; it is greyed out when the file is missing, so a broken path is visible rather than silently doing nothing. A texture edited outside the editor updates everywhere on its own, without reopening the effect. Emitters with no geometry simply show no thumbnail.

2.0.17 - 2026-09-16

  • Copying and pasting an emitter no longer kills the editor. On some effects — the Portal sample among them — pasting a copied emitter ended the session instantly and silently, taking unsaved work with it and leaving nothing in the log to explain it. The effects affected were those where a section of the Emitter Guide had been rewired by hand in the scheme: the copy then came out internally inconsistent, describing a setting as configured while the block it points at was missing from the copy. This affected the Start Velocity, Movement (Manual), generator and Max Life sections. Copies now carry the blocks other sections depend on, whether or not the section owning them was edited by hand.
  • Closing an effect or the editor no longer shuts it down without warning. When the Timeline panel had been torn out into its own floating window, closing the effect — or the editor itself — could end the session outright, losing whatever was unsaved. The preview was tidying up the Timeline's graph after the window holding it had already been destroyed. It now checks first. Reported from macOS, where the panel's window is destroyed in a different order, but the same flaw existed everywhere.
  • On macOS, tearing a panel out of the layout no longer leaves it stuck full-screen. Dragging a panel — the Timeline, a project window — out into its own floating window occasionally produced a window that covered the whole screen with the panel drawn as a small rectangle in the middle of a black background, and the only way out was the window's own restore button. The floating window now always opens at a normal size. Other platforms were unaffected.
  • The editor now tells you when your graphics driver rejects a shader. Until now such a failure was completely silent: the preview simply stayed empty, with nothing on screen explaining why, and no report reaching us. It could take out the GPU renderer entirely or just one effect, and looked the same either way. The editor now shows a message saying what happened — and, when the whole GPU renderer is affected, suggests switching to the CPU renderer so you can keep working. A report is also sent to us automatically so the problem can be fixed, carrying the driver's own message and the shader involved; the effect file itself is attached only if you have "Attach current effect to crash reports" enabled. This matters because these failures depend on the specific graphics card and driver — they cannot happen on our own test machines, so a user hitting one was previously invisible to us.
  • GPU renderer now starts on AMD cards. The shaders GPU33 generates carried a precision statement that only OpenGL ES accepts; desktop OpenGL allows it for numbers only. Lenient drivers ignored the difference, but a strict one rejected the shader outright — on those cards the GPU renderer failed to initialise, so previews and exported effects using it would not run at all. The statement is now emitted only where it is valid. Existing effects need no changes; re-export to pick up the fix in generated code.

2.0.16 - 2026-09-10

  • Added an embedded MCP server so AI agents (Claude Code, Claude Desktop and other MCP clients) can control the editor: open projects, create and edit effects, undo/redo, configure exporters and export effects (signing in stays a human action) and more. Agents see the editor UI as a tree of named elements and drive it like a person would — click buttons, switch modes, pick from menus and set values in any panel or dialog, with every action undoable as a single step. An agent can also close the editor when it is done, but nothing is saved or discarded behind your back: unsaved work raises the usual prompt, and the agent has to show it to you rather than answer it for you. When an agent hits something unreachable, confusing or broken, it can send a feedback report (with screenshots) straight to the NeutrinoParticles team — only with your explicit consent, from a signed-in account, and carrying nothing beyond the editor version, OS and active renderer. Off by default — enable it in Editor Settings or with the --mcpServer command-line flag; the server listens on 127.0.0.1 only.
  • Fixed a crash that could hit with several projects open at once — for example, right after creating a new project while another one finished rebuilding its preview.
  • Crash reports from macOS and Linux now say what went wrong. When the editor closed unexpectedly on those platforms, the report it sent could arrive without the one log line that names the problem, because the log is written on a background thread that the shutdown did not wait for. Reports now carry that line, plus the text of the underlying error. On macOS this also covers failures raised by the system's own interface frameworks — previously those arrived with nothing identifying them at all; the report now names the failure and the part of the editor it came from. Nothing changes in how the editor behaves — this only makes the reports we receive good enough to act on, so crashes get fixed faster.
  • Adding a graph key by clicking on a curve no longer closes the editor. Shift-clicking or double-clicking a curve in the graph editor to insert a key could, in about one attempt in forty, close the editor outright — the click landed a hair's breadth past the end of the curve section it belonged to. Clicks now always place the key inside its section, so it lands exactly where you aimed. Graphs saved with control handles reaching outside their own section (which could make a curve bulge past the keys holding it) are tidied up when the effect is opened; such a curve may look slightly different, and correct graphs are left exactly as they were.
  • Emitters can now carry color codes. With many emitters in an effect it gets hard to tell at a glance which timeline flag or which window belongs to which emitter. Right-click an emitter in the Emitters panel and pick Color Code: Auto Color chooses a bright color automatically, keeping it as far as it can from the colors already in use, Custom Color opens a full color picker, and Remove Color takes it away. Once set, the color shows as a small flag next to the emitter's name and on its generator flags in the Timeline — so everything that belongs to that emitter reads as one at a glance. Colors are saved with the effect; a reflected (mirrored) emitter gets its own automatic color instead of stealing the original's.
  • A new value type: Particle Speed. Any 1D value can now read how fast the particle is moving, straight from the value type menu — no need to build it from Particle Velocity and a "length" expression. It is offered wherever the movement mode actually produces a speed, and it works both on its own and as the X axis of a graph. The "Over particle speed" menu entry now uses it, so effects that already use that graph keep working exactly as before while becoming simpler inside: every value reading the speed shares one calculation instead of each carrying its own.

  • The preview JavaScript engine is now the same generation browsers run today. The editor executes effect previews on V8 — the engine behind Chrome — and it has been upgraded from a two-year-old version to the current one (V8 15.3, matching today's Chrome). Previews behave even closer to what your effect will do in a real browser or game runtime, and the editor benefits from two years of engine performance and stability work. International text APIs (Intl) in preview scripts now work on Windows as they do in a browser instead of closing the editor.

  • A rare preview crash is now detected and avoided. On long, intensive editing sessions, changing a value or an expression while the preview rebuilt could, very rarely, close the editor outright (a defect deep inside the JavaScript engine's memory management). The editor now detects that exact crash path, avoids it and keeps working; a one-time diagnostic report is sent automatically so we can confirm the root cause and ship a permanent engine-level fix in an upcoming version. The detection guard carries over to the upgraded engine unchanged.
  • Pasting an emitter whose rotation lost its angle block no longer closes the editor. If an effect's rotation section referenced an internal block that was later removed from the scheme, copying that emitter and pasting it could crash the editor outright. Pasting now reconciles the pasted emitter the same way opening an effect does, so the rotation settles into a consistent state and the paste completes safely.
  • Leaving a "changed on disk" question open no longer closes the editor. When files changed outside the editor, the question about reloading them could crash the editor if more changes arrived on disk while the question was still on screen — the longer it stayed open, the likelier the crash. The editor now holds those further changes back until you answer, so you can take your time, and then processes them as usual: nothing that changed meanwhile is missed.
  • The same protection now covers every dialog and menu, not just that one question. With auto-refresh on, a file changing outside the editor while any dialog or menu was open — export, settings, a right-click menu — could reload the project underneath it and close the editor. The reload now waits until you are done, and still happens afterwards, so nothing that changed on disk is missed.
  • The editor is far less likely to close itself when something else on your PC slows it down. Screen-capture tools, shell extensions and similar utilities hook into every window on Windows, and while such a hook holds the editor's window busy, the crash reporter could mistake the pause for a freeze and close the editor — losing the session even though the editor was working fine. It now waits considerably longer before treating an unresponsive window as a freeze, so those pauses pass unnoticed, while a genuine freeze is still reported.

2.0.15 - 2026-09-03

  • A stuck preview simulation no longer freezes the editor. On a very heavy effect, restarting the preview or releasing a gizmo drag could hang the editor forever: the interface waited for the effect's CPU simulation to finish a step that never returned. The editor now waits a couple of seconds at most; if the simulation is truly stuck, only that effect's preview stops — with a notification — while the editor stays fully alive so you can keep editing and save your work. Reopening or rebuilding the effect starts its preview fresh. The incident is recorded in the log and reported to the developers automatically.

  • Renaming an effect and clicking away no longer crashes the editor. Finishing an inline rename in the project tree by clicking somewhere else — on the emitter tree, the Emitter Guide or the preview — could close the editor outright. The rename was applied at the very moment the click moved keyboard focus, and applying it re-opens the effect and rebuilds those panels while the click was still being delivered to them. The rename is now applied right after the click has been handled; nothing visible changes, the renamed effect opens exactly as before. The same fix covers renaming folders in the project tree and renaming emitters, emitter folders and template blocks in the emitter tree.

  • Scaling a painted area no longer closes the editor. Shrinking an Area block with the scale gizmo made the brush cover ever more pixels of the area, and past a certain point the brush grew large enough to crash the editor outright. The brush now stops at a size it can actually paint, and its cursor shrinks along with it so you can see the size being used. The same limit applies when enlarging the brush with Shift+Wheel or when opening an effect that was saved with an extreme setting.
  • Opening a damaged effect file no longer closes the editor. Some effect files carry a bit of internal damage from an old saving bug; opening one could crash the editor outright instead of loading it. Such files now load through — the editor repairs the inconsistency on the way in — so you can open, inspect and re-save them as usual.
  • Switching Generation modes no longer closes the editor. On some effects, cycling the generator between modes (Periodic, By Distance, Approx Rate, Even Ring, Manual Keys…) could crash the editor. The internal bookkeeping the effect relies on could get out of step when the effect was loaded, and the next mode switch tripped over it. The bookkeeping is now reconciled when the effect opens, and switching modes is safe in any order.
  • Pasting an attached-emitter block no longer closes the editor. Copying a block that points at another emitter, deleting that emitter, then pasting the block could crash the editor the next time the effect was exported for preview. A pasted reference that no longer resolves is now cleared on paste — exactly as deleting the emitter clears it elsewhere — so the block simply lands with no target selected, and export stays safe even if such a stale reference slips through.

2.0.14 - 2026-08-31

  • Graphs can now run over anything, not just time. The six separate graph types (over particle life, particle time, particle speed, emitter time, system time, over a custom value) are replaced by a single Over value, whose X axis is a value you build yourself — a time source, a custom value, an expression over several rows, or a whole nested multi-value. Four new value types (Particle Life, Particle Time, Emitter Time, Effect Time) are there to be dropped into X, and work as plain numbers anywhere else too. The old menu entries remain as one-click shortcuts that fill X in for you, so the quickest way to a graph over particle life is exactly what it was. When X is a simple one-line value (a time source, a custom value, a number), the whole graph value folds back into the familiar single row with X shown inline next to it; X only expands into its own block when you build something bigger there — several rows, a nested value, an expression. Existing effects open unchanged: every saved graph becomes an Over value with its X already set to whatever it ran over, curves intact, and exports exactly as before.
  • Two new value types: Number of Shots and Number of Particles. Any 1D value can now read how many shots the generator has already completed (Periodic and Even Ring generators), or how many particles the emitter currently has alive. The shots count starts at 0 for the particles of the very first shot, so it can drive anything that should change from shot to shot — colour, size, direction. Both are available straight from the value type menu, with no need to edit the block scheme. Number of Particles is not supported when exporting to GPU33: such an effect now reports a clear validation error instead of failing silently.
  • Two ready-made Multi-Value templates in the value type menu. Next to "Switch to Multi-Value" the menu now offers a * b and a + b. Either one turns the value into a Multi-Value, adds a second row holding 1 and fills in the expression — in a single click, instead of switching, adding a row, typing the number and typing the expression by hand. These are the two most frequent expressions by far, so this removes most of the typing from building one. A single Undo takes the whole thing back. The entries are not offered for rotation (quaternion) values, where such an expression has no meaning.
  • A graphics error no longer closes the editor. If preview rendering hits a GPU/OpenGL problem, the editor now retries for a moment (a brief hiccup recovers invisibly); if the problem persists, only the preview stops — with a notification and a red border — while the editor stays fully alive so you can keep editing and save your work. Opening an effect starts the preview again. The error is recorded in the log and reported to the developers automatically, so such problems keep getting fixed even though they no longer crash.
  • Collision shapes are now one click away. Editing a Collide block's surface, the preview toolbar shows a button for each shape — plane, sphere, box and capsule — instead of a single "+" that opened a menu. You can see at a glance which shapes are available, and adding one no longer takes two clicks.
  • Menus now open next to the button you pressed, not next to the mouse. When the editor is driven from the background — by an automation tool or a test run — a menu used to appear wherever the mouse pointer happened to be, which could be on another monitor entirely. Menus opened from a button are now placed against that button, and are kept fully on screen. Working with a mouse is unchanged: the menu still appears under the pointer, exactly where it did before.
  • The preview now reads in your own language. In the Chinese UI the navigation hint at the bottom of the preview and the F1 shortcuts panel used to render as "???? · ???? · ????": the preview draws its own text from a built-in font set that covers Latin characters only, so anything outside it became a question mark. Everything written in the preview now draws through the editor's own fonts and shows the translation itself — the hint line, the F1 panel, the renderer and view badges, the SLOWDOWN indicator, the selected object's name and the messages that flash at the top. The context hints of the path, area, grid, surface and gizmo editors are translated as well; until now they were always English, whatever language the editor was set to, and so were the view names in the view menu. Numbers stay as they are: cursor coordinates, gizmo drag readouts and grid labels are not translated in any language. Should a translation ever reach a part of the preview that still uses the built-in font set, it falls back to readable English rather than question marks.
  • Path keys now snap to the grid while you drag them. With grid snapping on, moving a path key — or placing a new one — sticks to the grid lines as it passes them, the same way dragging a gizmo arrow already did. Previously only the gizmo arrows snapped: grabbing a key directly on the curve ignored the grid entirely, which made it look as if snapping worked only sometimes. Dragging several selected keys shifts them as one rigid group, anchored on the selection, so the shape you built stays intact. Bezier handles keep moving freely — the grid is for path points, not for curvature.
  • Origin has its own icon in the Emitter Guide. It used to share the map-pin icon with Starting Position, which made the two sections hard to tell apart at a glance even though they mean different things — where the particle is born in space, versus which point of the particle's own image sits at that position. Origin now shows a distinct anchor-in-frame icon.
  • Crash reports now record which graphics card and driver version the editor runs on, so crashes caused by a specific GPU driver can be recognized and diagnosed.
  • The Texture section no longer sits looser than the rest of the Emitter Guide. In Grid mode the Texture, Grid Size and Frame Index rows were separated by noticeably wider gaps than any other section, because the Grid rows carried an extra 9px of padding above and below them — 18px in total. The rows now follow the same zero-margin layout convention as the rest of the Emitter Guide.
  • A rare crash when deleting an effect is fixed. Closing or deleting an effect while the timeline was on screen could shut the editor down without warning. The generator markers drawn on the timeline — the delay and end boundaries of Approximation and Periodic generators — kept reading the blocks they belong to for a brief moment after those blocks were already gone, and a redraw landing in that moment took the whole editor with it. The markers now check that their block is still there before drawing anything, so the timeline simply stops showing them instead.
  • The editor no longer reports an error when it closes. Shutting the editor down — in particular the restart offered after changing the interface language — could end with an error being logged and reported, because the preview released its graphics resources a second time after they were already gone. The editor now shuts down cleanly. Nothing was lost when this happened: the error came at the very end of closing, after your work had been saved, and the newly started editor was unaffected.

2.0.11 - 2026-08-22

  • Updating the editor no longer deletes your files. Until now an automatic update cleared the entire editor folder, so any effects or other files kept there were lost. The editor now records which files belong to it and removes only those — anything of yours in the folder, including effects saved next to the bundled samples, is left alone. Updating from an older version, which has no such record, still has to clear the folder, so the editor warns you first and lets you cancel. The bundled samples themselves are always replaced, so keep your own copies under different names.

  • New "Noise" value type in the Emitter Guide. Any 3D value slot (a color, a size, a position offset…) can now be driven by a 3D noise field, straight from the value's type menu — no scheme editing needed. The point the noise is sampled at is a full nested value (the particle position by default, so the noise reads as a coherent spatial field), and the value exposes the field's smoothness, animation speed and an output scale that can itself be randomized or animated.

  • The editor speaks your language. A Language setting in Editor Settings switches the interface between English and Simplified Chinese, and offers to restart to apply it. By default the editor follows your system language. The whole interface is translated — menus, dialogs, the block palette and scheme, the Emitter Guide, block properties, the graph editor and native buttons — and block tooltips keep the original English block name, so Chinese users can still follow English docs and tutorials. A Chinese font ships with the editor, so the interface reads correctly even on systems with no Chinese fonts installed. Your effects are unaffected: names, presets and exported code stay exactly as they were, and a project saved in one language opens identically in the other.

  • The interface font now looks the same on every platform. The editor's own font files had been stored damaged since they were added, so Qt quietly ignored them and each platform drew the UI with whatever system font it had — Tahoma on Windows, something else on macOS and Linux. The editor now ships and uses Roboto, so the interface reads the same everywhere.
  • Fixed a crash when the Emitter Guide panel refreshed while a Multi-Value expression field was still being edited — for example right after an undo or an external change to the effect.
  • Fixed a custom value silently getting renamed when the Emitter Guide panel refreshed while its name was still being edited — for example right after an undo or an external change to the effect. The half-typed name is now discarded instead of being written to the value.
  • Added a "Reverse Direction" button to the path editor toolbar. It flips the direction a path runs in while keeping its exact shape, including Bezier handles — only the direction arrows on the segments change.
  • Fixed a crash when switching from one GPU effect to another — for example, opening a sample effect right after creating a new one.
  • Fixed a crash when changing the dimension of a multi-row value whose row is a spatial type (Sphere, Circle, Area, Grid, Point Between Paths). These rows are locked to their 3D output, so the row menu no longer offers dimensions they cannot take.
  • The Emitter Scheme canvas is now darker than the panels around it, so the scheme no longer blends into the neighbouring windows.
  • Fixed a crash when opening an effect that contains a reflected (mirrored) emitter. While syncing the mirror, the editor re-decided which parameters it needed and deleted one it had just taken from the source emitter, which broke the link back to the emitter it mirrors. A mirror now takes its configuration from its source instead of recalculating it.
  • The editor no longer shuts itself down when it is merely busy. Crash reporting treated five seconds without a response from the interface as a freeze and closed the editor — long enough to catch an ordinary slow moment, such as a file dialog opening a folder on a network or cloud drive. That limit is now ten seconds, so a slow operation finishes instead of costing you the session.

2.0.10 - 2026-08-14

Version 2.0 is a major release. The preview, the timeline and the Emitter Guide have all been rebuilt, and the editor gained collisions, ribbons, per-particle spin and a lot more. Here is what is new since 1.4.

Preview and Timeline

  • One timeline for the whole scene. Every effect in a scene now plays together under a single shared playhead, each with its own coloured population curve, so you can see how they fill and fade against each other.
  • Effects can be animated along the timeline. Move and rotate an effect with its gizmo or the Position/Rotation fields and the preview records the motion, replaying it exactly on seek, loop and restart. A Record Effect Orientation toggle switches between full motion and a simpler steady mode.
  • Heavy effects play smoothly. GPU playback was rewritten to simulate ahead of the playhead: 100k+ particle effects hold a steady 30+ fps where they used to crawl. Effects too heavy for real time no longer freeze — the timeline slows down and keeps advancing, telling you it is catching up.
  • Loop borders. A movable loop border gives a clean fixed-length loop even for effects whose particles never disappear, and a Preview Start marker pins where playback begins. With Loop on you can also set how long the effect must stay empty before it restarts — useful for effects with a deliberate pause built in.
  • Timeline flags. Generator starts and ends, Preview End and a draggable Pre-sim marker are labelled with colour-coded flags that stack when they crowd together and double as grab handles. Time and frame appear right next to the cursor as you drag.
  • Live particle counts. The timeline shows the population under the playhead, and the Emitters window shows each emitter's count against its capacity, plus how much memory the effect needs at runtime.
  • Background media follows the timeline. Videos and image sequences rewind on seek and restart in step with the particles, and play back smoothly and far more cheaply than before.
  • Per-effect background colour, picked from a swatch in the preview toolbar and saved with the effect.
  • Renderer pill in the preview corner shows whether GPU or CPU is active and switches between them in one click.

Particles

  • Collisions. Particles can bounce off, slide along and settle on static surfaces. A new Collide block holds planes, spheres, boxes and capsules; give particles a radius and they collide as spheres rather than points. Bounciness and friction are carried per particle and combined with each surface's, so a rubber ball and a steel bead behave differently on the same floor. Collisions are available from the Emitter Guide as well as the scheme, and are supported when exporting to JavaScript and C# and in the GPU renderer.
  • Stripes. A new Geometry mode turns an emitter's particles into a continuous textured ribbon — smoke trails, energy beams, swooshes — with its own Size, Colour and Rotation.
  • Self Rotation. Each particle can carry its own spin, independent of how its quad faces the camera.
  • New Grid block. Place particles on an evenly spaced lattice — a wall of tiles, a formation of sparks, a field of debris. Give it columns, rows, width and height, and an input in the range 0–1 picks a node. Feed it a Random to scatter particles across the grid, or a curve to walk them node to node as they age. The grid is placed visually in the preview with corner handles and a gizmo, and is available straight from the Emitter Guide.
  • From Axes rotation drives both orientation axes with any 3D value — velocity, position, a graph, an expression or the camera direction.
  • Camera direction as a value type, letting colour, transparency, rotation, origin and texture frame respond to where each particle sits relative to the camera.
  • Positioner outputs — prev position, velocity, speed and direction — derived from how far the particle actually moved, whatever moved it.
  • Gen Burst Position gives a particle its place inside the burst it was born in, from 0 for the first to 1 for the last.

Emitter Guide

  • Attached Emitters can be added, targeted and configured without opening the Emitter Scheme. Reflected emitters can override their texture and origin per emitter.
  • Nested values. Any row of a combined value can become a combined value of its own, up to four levels deep, so a base size plus a randomized variation no longer means leaving the Guide for the scheme.
  • Arrange it the way you work. Sections can be reordered by dragging their coloured header, and their collapsed state is now a setting of the editor — shared across every emitter, effect and project, and kept across restarts.
  • Copy, paste and presets on every group and on single values. Presets are stored as ordinary files and can be organized into folders.
  • Emitter folders organize emitters into a nested hierarchy; top-to-bottom order drives render and export order.
  • Colour multipliers let you pick a colour in the normal 0–1 range then push it past 1 to drive HDR bloom glow.

Editing and navigation

  • Rebuilt path editing. A full 3D path editor, a Closed mode that joins the last point back to the first into a proper loop, always-visible Bezier handles selectable on equal footing with keys, and new keys that continue the path's existing style instead of always inserting a straight segment.
  • Painted Areas gained straight lines with Shift, the way other raster editors do it.
  • Modernized navigation — middle-mouse pan, cursor-anchored wheel zoom clamped so you cannot get lost, Ctrl+A / C / X / V / D, and Esc to cancel any drag.
  • Transform gizmos grab exactly where you see them across every mode, view angle and zoom.
  • Per-mode camera memory — Free and each planar view remember their own position, zoom and orientation.
  • A new grid sized to the project's base unit, with axis lines, in-world numeric labels and axis letters. It can sit behind the particles, in front of them, or be sorted by depth.
  • On-screen HUD with live world coordinates, a selection label and context-sensitive hints; F1 shows a keyboard cheatsheet for the current editor.
  • Lock Layout freezes the panel arrangement so a panel cannot be dragged or pulled out by accident.
  • Keyboard playback — Space restarts and plays, B toggles play/pause, from anywhere in the editor.
  • Rotation properties are far easier to edit: fields keep what you type, angles stay in degrees, and a dropdown switches between Axis+Angle and Euler.
  • Manual generators can be edited directly on the timeline as amount-scaled bars you can drag, add, delete and rect-select.

Project and export

  • Export from the project tree. Folders show an Export button when anything inside still needs exporting, and the right-click menu gained Export and Re-export. Changing an exporter's settings now marks already-exported effects as needing export again.
  • Axes setup in Project Settings, with presets for PIXI, Unity, Blender, Unreal and 3ds Max and an interactive diagram. Existing projects migrate automatically.
  • Opening an older effect no longer marks it unsaved — the format upgrade happens in memory, and a Resave action rewrites it on demand.
  • Bloom can use either the Cocos Creator or Unity (URP) algorithm, with a setting for how far the glow spreads.
  • Editor Settings dialog collects application-level preferences in one place.
  • Scheme warnings. A Random block wired into a constructor input is flagged with an amber outline rather than silently producing a constant.

Look and feel

  • Refreshed modern dark theme, redesigned Welcome dialog with searchable recent projects, and redesigned notifications with a bell icon, a colour-tagged dot and a drop-down log.
  • Clearer value editing throughout: distinct icons per value type, named labels on settings-less values, section-header icons and a per-emitter capacity badge.
  • The preview draws a soft red border when the current effect has an error, and a SLOWDOWN pill when playback cannot keep up in real time.
  • Wireframe and visibility buttons draw particle outlines over the live preview and hide an emitter's particles while it keeps simulating.
  • Version-matched documentation — "Read more…" links open the docs for your editor version on a rebuilt docs site with a version picker.
  • Crash reports are fully symbolicated on Windows, macOS and Linux, and carry the effect you were working on.

Size

77.17 MB

SHA-256

134fb0abb235b49033a58df2f72c17ce8ea4e31a83902ac2f215858217bc2171