ParticleEditorPlugin¶
The ParticleEditorPlugin is a plugin for the Feather Debugger that lets you edit LÖVE ParticleSystem properties live from the Feather desktop app. Register any love.graphics.ParticleSystem, tweak all 30+ properties in real-time, and export the result as copy-paste-ready Lua code.
📦 Installation¶
The plugin lives in plugins/particle-editor/. Require it from your project:
⚙️ Configuration¶
Register the plugin and then add particle systems after the debugger is created:
local debugger = FeatherDebugger({
plugins = {
FeatherPluginManager.createPlugin(ParticleEditorPlugin, "particle-editor", {}),
},
})
-- Create a particle system
local image = love.graphics.newImage("particle.png")
local ps = love.graphics.newParticleSystem(image, 500)
ps:setEmissionRate(80)
ps:setParticleLifetime(0.3, 0.8)
ps:setSpeed(20, 60)
ps:start()
-- Register it with the plugin
local editor = debugger.pluginManager:getPlugin("particle-editor")
editor.instance:addSystem("Fire", function()
return ps
end, 'love.graphics.newImage("particle.png")')
The third argument to addSystem is a Lua code string used in the exported code to reference the image. It defaults to "image" if omitted.
Using with auto.lua¶
If you use feather.auto, the plugin is registered automatically. Access it via the global DEBUGGER:
require("feather.auto")
local editor = DEBUGGER.pluginManager:getPlugin("particle-editor")
editor.instance:addSystem("Sparks", function() return myParticleSystem end)
🔧 API¶
addSystem(name, getter, imageRef)¶
Register a ParticleSystem for editing.
| Parameter | Type | Required | Description |
|---|---|---|---|
name |
string |
Yes | Display name shown in the system selector. |
getter |
fun(): love.ParticleSystem |
Yes | Function that returns the ParticleSystem instance. |
imageRef |
string |
No | Lua code string for the image in code export (default: "image"). |
removeSystem(name)¶
Unregister a previously added ParticleSystem.
| Parameter | Type | Required | Description |
|---|---|---|---|
name |
string |
Yes | Name passed to addSystem(). |
🖥️ Desktop UI¶
Actions (toolbar)¶
| Action | Description |
|---|---|
| Export Code | Copies generated Lua code to clipboard. |
| Emit | Emits a burst of particles (count configurable via Emit Count). |
| Reset | Resets and restarts the particle system. |
If multiple systems are registered, a dropdown selector appears in the toolbar.
Property Cards¶
Properties are organized into collapsible cards by category:
| Card | Properties |
|---|---|
| Emission | Emission Rate, Emitter Lifetime, Particle Lifetime Min/Max |
| Direction | Direction, Spread |
| Speed | Speed Min/Max |
| Acceleration | Linear Accel X/Y Min/Max, Radial Accel Min/Max, Tangential Accel Min/Max |
| Damping | Linear Damping Min/Max |
| Size | Sizes (vector), Size Variation |
| Rotation | Rotation Min/Max, Relative Rotation |
| Spin | Spin Min/Max, Spin Variation |
| Offset | Offset X/Y |
| Visual | Insert Mode, Colors (vector) |
All number inputs are constrained with type="number", min/max, and step values. Changes apply instantly to the live particle system.
Sizes and Colors use a vector input — each component gets its own labeled field (e.g. Start/Mid/End for sizes, R/G/B/A groups for colors).
Code Export¶
Click Export Code to copy a complete Lua file to your clipboard:
-- Generated by Feather Particle Editor
-- 2026-05-04 10:15:14
local ps = love.graphics.newParticleSystem(love.graphics.newImage("particle.png"), 500)
ps:setColors(1, 0.6, 0, 1, 1, 0.2, 0, 0.8, 0.3, 0.1, 0, 0)
ps:setDirection(-1.5708)
ps:setEmissionRate(80)
ps:setSpeed(20, 60)
ps:setSizes(1.5, 1, 0.3)
-- ... all properties
return ps
Numbers are formatted with up to 5 decimal places, trailing zeros stripped.
💡 Tips¶
- Register multiple systems with
addSystem()— switch between them from the desktop dropdown. - The
imageRefparameter controls how the image appears in exported code. Use the actual path string you'd use in your game, e.g.'love.graphics.newImage("assets/fire.png")'. - Call
ps:update(dt)inlove.updateandlove.graphics.draw(ps, x, y)inlove.draw— the plugin edits properties but doesn't handle drawing.