Skip to content

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:

local ParticleEditorPlugin = require("plugins.particle-editor")

⚙️ 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 imageRef parameter 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) in love.update and love.graphics.draw(ps, x, y) in love.draw — the plugin edits properties but doesn't handle drawing.