See it running
What it does
- Twelve live parameters: emission, speed, length, spread, buoyancy, intensity, noise scale, animation FPS, distortion and lash density
- Five colour palettes — Classic Fire, Blue Plasma, Toxic Green, Violet Hellfire, White Hot
- Two custom shaders: an animated flame stream and a separate heat-haze distortion pass
- Marked @tool, so the effect renders and updates live in the Godot editor
- Exposed as a Flamethrower node the client can drop into any scene
Built for a client
Built to a written brief: an anime-style flamethrower a designer could retune without touching code. Delivered as a self-contained Godot node with exported ranges, palette presets and a demo scene for trying values out quickly.
The thought
The brief asked for a flame effect. What a team actually needs is one they can change at 2am without tracking down the programmer, so I built it as a tool from the start.
Mechanics
A fan-shaped jet emitted along the node’s local +X axis with the anime fire treatment drawn over it. Spread, length and buoyancy shape the cone. Noise scale and distortion break up the silhouette so it never reads as a repeating loop, which is the thing that gives most stylised fire away.
Systems
Every exported property runs through a setter that just marks the effect dirty instead of rebuilding straight away, so dragging a slider does not thrash the particle system. Palettes are data rather than branches, which is why adding a sixth colour is a one-line change.
Under the hood
Roughly 870 lines across three scripts and two shaders. flamethrower.gd owns the parameters and the dirty flag, flame_palettes.gd is a plain colour table, and demo.gd is nothing but the tuning UI. You can delete demo.gd and the effect still works, which was the point.
What the client said
Big vouch for Mazen. I needed some custom VFX work done, and he delivered top-notch results that fit perfectly with my project’s vision. He was professional, quick to respond, and easy to work with from start to finish. Would definitely collaborate again!