Free Blender add-ons

HoovyTools: bring SFM into Blender

Two free add-ons for Source Filmmaker artists. SFM Session Importer rebuilds a whole SFM session in Blender: models, animation, faces, cameras, lights, sounds, particles and the map. Source Particle Import turns .pcf effects into live, editable geometry nodes. The two are twins: one HoovyTools sidebar tab, and a session's effects arrive through the particle half.

HoovyTools is free, with no paywall: credit appreciated, never required. If it saves you time, the asset library on Patreon is the way to support HoovyTube.

Particle Import imported SFM effects playing in Blender
The add-ons

Pick your tool

Free tools in the spirit of SourceIO and Blender Source Tools. Jump straight to the one you need.

At a glance: the two released add-ons
DetailSession importerParticle Import
Brings into BlenderA whole SFM session, one shot or the whole film: models, animation, faces, cameras, lights, sounds, particles and the map.pcf particle systems as live geometry nodes
ReadsSFM session .dmx files.pcf, .vtf and .vmt files
Also needsYour SFM install. SourceIO only for mapsNothing else: standalone
Blender versionas declared by the add-on5.0.1 or newer4.2 or newer
Where it lives3D View sidebar (N) > HoovyTools > SFM Session Importer, and File > Import > Source Engine3D View sidebar (N) > HoovyTools > Source Particle Import, and File > Import > Source Engine (.pcf)
Latest versionv3.0.10v3.0.7
DownloadHoovyTools-SFMSessionImport-Blender-3.0.10.zip (6.0 MB)HoovyTools-ParticleImport-Blender-3.0.7.zip (9.9 MB)
Source and older versionsGitHubGitHub
Session importer

HoovyTools: SFM Session Importer

v3.0.10Free.zip, 6.0 MB

What it is

Developed between 2023 and 2026 with the permission of RedEye, the creator of SourceIO, HoovyTools brings full SFM session import into Blender: models, animation, facial animation, cameras, lights, sounds, particles and the map, on SFM's own timeline. Point it at an SFM session and your work lands in a modern, far more stable environment, without rebuilding anything by hand.

Source Filmmaker saves a session as a DMX file and has assumed, since 2012, that nothing else will ever open it. Version 3.0.10 reads it directly, lists every shot by name, and imports one shot or the whole film. Models now come in through the add-on's own MDL reader, so SourceIO is only needed for the map.

Requirements

  • Blender 5.0.1 or newer, the minimum the add-on declares
  • Your own copy of Source Filmmaker: models, textures and sessions come from your install. It is found in its default Steam folder; Dev > Wiring has a LOAD button for one that lives elsewhere
  • Optional: SourceIO for maps. Without it the map is left out and the rest imports anyway
  • Optional: Source Particle Import, the twin add-on, for the session's particle effects
Video tutorial the session importer in action

SFM to BLENDER Session Importer

FreeSteam Workshop11.3 MB

View on Steam

What the import brings across

  • Every shot, by name

    Load a session and every shot is listed by name, slugs included. Import one, or the whole film, on SFM's own frame numbers.

  • Models, its own way

    Its own MDL reader brings skins, bodygroups, eyes and materials, plus standalone MDL, VMT and VTF importers. No SourceIO needed.

  • Animations

    Every bone channel is sampled and baked onto the Blender armature, keyframe for keyframe.

  • Shape keys

    Facial flexes and flex controllers become native Blender shape keys, animated over the timeline.

  • Cameras

    The SFM camera is rebuilt as a Blender camera with position, rotation and FOV, keyed as it moved.

  • Session sounds

    Every game sound in the session lands in the Video Sequencer as a trimmed strip at its shot time, with audio scrubbing on.

  • FPS-aware timing

    Everything is retimed to your scene (for example 24 to 30 FPS), so animation, sound and camera stay locked together.

  • Lights, particles and the map

    Lights become Blender spots keyed where SFM keyed them. Particles come in through Source Particle Import, and the map through SourceIO, lined up the way SFM shows it.

  • A Dev tab that shows its work

    Wiring checks everything the add-on needs and says where it found it. PRINT HELP writes one report file to send when something breaks. Every step shows a progress bar.

Install in three steps

  1. Download the .zip

    Get HoovyTools-SFMSessionImport-Blender-3.0.10.zip. Don't unzip it.

  2. Drag it onto Blender

    Drop the zip on any Blender window. Blender offers a Legacy Add-on install: keep Enable on Install ticked and press OK. (Edit > Preferences > Add-ons > Install from Disk does the same.)

  3. Open the panel

    Press N in the 3D viewport: HoovyTools > SFM Session Importer. For maps, also install SourceIO.

Coming from 1.3.1? Disable or remove it first: the two share their buttons. 1.3.1 is kept on GitHub as release 2.0.0.

Then import

Main tab > LOAD DMX SESSION (the browser opens in usermod/elements), pick a shot or Whole Session, press IMPORT SHOT n. One shot at a time is the sane default: a whole film imports every cut on top of each other. Or run the eight elements one at a time, each with its own progress bar:

  1. Import Models

  2. Import Animations

  3. Import Shape Keys

  4. Import Cameras

  5. Import Sounds

  6. Import Lights

  7. Import Particles

  8. Import Map

Wiring in your usermod. SFM keeps your custom models, materials and sounds inside your usermod and the game folders it mounts. HoovyTools resolves every asset a session references by those same relative paths, so it finds your content exactly the way SFM did, with nothing renamed or re-pathed. If a model comes in missing, it is almost always a usermod path that has not been added yet. The Dev > Wiring section shows what was found and where: SFM, the mod folders, SourceIO, the particle importer, the loaded session.

Under the hood

An SFM session is a DMX file: a tree of elements that describes the shot. HoovyTools reads it directly (the same format datamodel and dmxconvert work on), walks the tree, and translates each piece into the closest thing Blender understands. It is built as a stack of small, single-purpose scripts: each does one job and hands clean data to the next.

  • Session data: the clip and shot structure, plus the master timeline
  • Animation data: per-bone transform channels, baked onto the armature
  • Camera data: the camera transform and FOV channels
  • Sound clips: the game sounds a session references and their frame positions
  • Flex channels: the flex-controller values that drive faces
Where Blender stands in for SFM
In SFMIn Blender
Flex controllersShape keys
SFM cameraCamera with animated F-Curves
DMX sound clipsSound strips in the Video Sequencer
SFM units and Y-up axesBlender units and Z-up axes
Session timelineScene frame range and FPS

What's new in the session importer

Full notes and every build on GitHub Releases.

v3.0.10LatestNov 2026
  • A failed import says what is missing. When a session's models are not on this computer, the report, the one-click summary and PRINT HELP name every .mdl it could not find, and say so when one is in another SFM install on the same computer.
  • The right SFM, on any drive. Loading a .dmx picks up the SFM install it sits in, and the usual Steam folders on every drive are searched too. A session import searches every install, its own first.
  • SFM Detective: a standalone folder finder. It finds every Source Filmmaker install and, given a session, every model it uses and where each one is, or that it is nowhere.
  • Import Animation: Easy Import. Fix the rest pose, stand the take upright, bring its model along, keep the root at the origin or bake it.
  • Import VMT / Import VTF put each file on a preview sphere at the 3D cursor; a particle material shows its texture.
  • A session without lights no longer reports a failed step.
Read moreRead less

Most of this release began with a log that said 3 missing and nothing else. Three of what, missing from where, was left as an exercise for the reader. The import now answers both: step 1, the one-click summary and PRINT HELP name every models/...mdl the session asked for and could not find, and when one of them is sitting in another Source Filmmaker install on the same computer, they say which one. When none of the models turn up, the summary no longer suggests checking SourceIO, which was almost never the problem.

Behind that was a quieter bug. A session import looked for models in exactly one SFM install, whichever the preference named, however many others you had set up. The default preference is C:\Program Files (x86)\Steam\..., a fine guess right up until your Steam library lives on D:. Loading a .dmx now walks up from the file to the gameinfo.txt it belongs to and adopts that install; the session's own SFM is searched first, then every other one. The new preference Look for SFM on every drive also checks the usual Steam folders on each local drive and every library Steam lists in libraryfolders.vdf. Network and CD drives are skipped: a disconnected network drive can hold a folder check hostage for half a minute, and nobody asked for that.

SFM Detective is the same investigation as a standalone script in # tools. It needs nothing, not the add-on and not Blender: it reads the registry, every Steam library, the usual folders and, with --deep, whole drives, which is how it finds the renamed copy someone made in 2019 and forgot. Give it a session and it lists every model the session uses, where each one resolves, whether the .vvd and .vtx it needs are beside it, and which of its materials are missing, read straight out of the .mdl header. The report is written for whoever ends up helping.

Import Animation grew an Easy Import mode. It fixes the rig's rest pose, stands the take upright by measuring which way the character actually stands across the whole take (every SFM DMX declares Y as its up axis, which is true of SFM and not always of the data), brings the model along from the file, from what you used with that animation before, or from a path, and either pins the root at the origin or bakes its motion into the object. The default profile is now Session-aware, so root motion is kept: the previous default quietly dropped it every time the dialog opened, and the character lay down in protest.

Import VMT and Import VTF now put each file on a preview sphere at the 3D cursor, one beside the other in their own collection, since a material you cannot see is mostly a rumour. Particle materials (SpriteCard) have no recipe in the built-in importer and used to arrive as empty materials; they now show their $basetexture, drawn as light when the material is additive. And a session without lights no longer reports 6 Lights: FAILED. It had nothing to import and did so successfully.

v3.0.0Oct 2026
  • Every shot by name. The session's shots are listed by name, slugs included: import one, or the whole film.
  • Map step. The map is an import step of its own, lined up the way SFM shows it. Without SourceIO it is left out and the rest imports anyway.
  • Its own importers. MDL, VMT and VTF read by the add-on itself: models no longer need SourceIO.
  • Lights and particles as import steps, particles through the twin add-on, Source Particle Import.
  • A progress bar on every step, the standalone ones included.
  • Dev tab: Wiring, PRINT HELP, Configure, Credits and Developer Mode.
Read moreRead less

3.0.0 is the first version built for other people's sessions, which turned out to be a different job from importing your own. Shots are listed by name, slugs included, and everything lands on SFM's movie time rather than the time inside the clip it was read from. The difference is not academic: a shot with a negative clip offset used to start its first few seconds before frame 0, where Blender clamps the scene range without a word and the beginning of the shot simply falls off the edge.

Models come in through the add-on's own MDL reader, which is SourceIO's own code carried inside the add-on with its author's permission, so SourceIO is now only needed for maps. The map is an import step of its own, turned to line up with the session the way SFM shows it. Materials come in full, as small proxy textures (each material's smallest mip of 64 pixels or less, decoded straight from the VTF, so a 4K texture does not have to be unpacked to make a thumbnail), or as plain grey for when only the motion matters.

Cameras got the most attention. SFM stores rotations as quaternions and happily writes q or -q for the same orientation; blend the two sets of numbers naively and a frame halfway through a perfectly still shot turns 180 degrees. The importer now keeps every key in one hemisphere, interpolates with slerp, never blends across a cut, and finishes on clean Euler curves. A separate pass finds spins that were baked into the keys themselves and rebuilds them, which is the polite way of saying it repairs the file.

Lights and particles are steps too, particles through the twin add-on, Source Particle Import. Anything hidden in SFM stays hidden. Every step has a progress bar, so working and frozen no longer look the same. And the Dev tab gained Wiring, which shows what was found and where, and PRINT HELP, which writes one report file to send when something breaks. Reading a report beats guessing, for everyone involved.

v1.3.12.0.0 on GitHub
  • Session Sounds import is about 100x faster. A full session now parses in about 0.3 seconds instead of about 38.
  • Global Offset (seconds) shifts every placed game sound, for audio that should not start on frame 0.
  • Tools Text Editor folder: Text Editor versions of the tools, so a single tool can be hot-reloaded (Alt+P) without reinstalling the add-on.
Read moreRead less

Session Sounds in 1.3.0 worked, given time: a full session took about 38 seconds to parse. The culprit was the DMX reader's id-collision check, which scanned a list for every element it loaded. A session has around 17,000 elements, which came to roughly 140 million UUID comparisons, each one confirming that the element was, in fact, new. 1.3.1 keeps an index of ids for the length of the import, and the same session parses in about 0.3 seconds. The shared DMX library itself is left untouched, so every other tool reads DMX exactly as it did.

Finding the sound track no longer walks the whole element graph either; it reads the Sound track group's tracks directly. Global Offset shifts every placed game sound by a number of seconds, applied as whole frames at the scene's frame rate (+1.0 s in a 30 fps scene is 30 frames), for audio that should not start on frame 0. The new Tools Text Editor folder holds Text Editor versions of the tools, so a single tool can be reloaded with Alt+P instead of reinstalling the add-on and restarting Blender out of habit.

v1.3.0
  • New step 6, Session Sounds: reads every sound clip in a session .dmx and lays each game sound into the Video Sequencer as a trimmed strip at its shot time.
  • Clip times are retimed from the session's frame rate to your scene's, so wall-clock timing holds.
  • Sound paths resolve under your usermod sound/ folder, and A/V sync plus audio scrubbing are switched on.
Read moreRead less

1.3.0 added step 6, Session Sounds. It reads every DmeSoundClip in the session and lays each game sound into the Video Sequencer as a sound strip, trimmed and placed at its shot's time. The clip's offset sets the strip's in-point and its duration sets how much of it is heard, which is how SFM thinks about them too.

Times in a session are authored at the session's own frame rate (the movie settings override if there is one, the render settings otherwise), so every clip is re-timed to the Blender scene's rate and wall-clock timing survives the trip from 24 to 30 fps. Sound paths are found under usermod's sound/ folder and the tf and hl2 mounts, ignoring case, which Source never cared about either. A/V sync and audio scrubbing are switched on, so you can hear the shot while you scrub it.

v1.2.2v1.2.1
  • Remove All Animation now clears a rig back to its pre-animation state: bone and shape-key animation are removed and rest poses restored.
  • Rigs no longer rotate 90° when you strip and re-import them.
Read moreRead less

1.2.1 fixed a rig that turned 90 degrees every time its animation was removed and imported again. SFM is Y-up and Blender is Z-up, so each rig sits under an axis transform that turns it +90 degrees around X. Removing the animation unparented the rig and baked that turn into it, and the next import added another. The rig now keeps its own local transform when it is unparented, so the correction is applied exactly once, however many times you change your mind.

1.2.2 made Remove All Animation mean it: the bone action and the shape-key animation on the rig's meshes both go, the flex sliders return to rest, and the rest pose is restored from the reference DMX. The rig's folder turns white last, so the scene reads as models only.

v1.2.0
  • New sidebar with three tabs: Anim Set, Import and Tutorial.
  • Anim Set shows a live status board for every rig, plus cleanup buttons.
  • Animation Scale option multiplies location keys to fit a rescaled model.
Read moreRead less

1.2.0 introduced the sidebar, with three tabs. Anim Set is a live status board for every rig in the scene: orange once the model is in, yellow once it has animation, green once its meshes carry shape-key animation, with buttons to clear out rigs that never got any animation, or to remove all of it. Import mirrors the File > Import entries, and Tutorial shows which usermod folder is in use and whether SourceIO is installed, with green and red ticks.

DMX Animation and Animations (Folder) gained Animation Scale, which multiplies location keys, bones and root alike, to fit a model you have rescaled. Rotations are left alone, since a rotation does not get any bigger when the model does.

Particle Import

HoovyTools: Source Particle Import

v3.0.7FreeStandalone.zip, 9.9 MB

The problem this solves

Everything else in an SFM project can leave SFM. Models, maps, animation and cameras all have a road into Blender through SourceIO, Blender Source Tools and the HoovyTools session importer. Particles did not. An SFM effect is a .pcf file: a description of emitters, forces and sprites that only Source could play. Move a scene to Blender and every explosion, muzzle flash and smoke trail stays behind.

Particle Import reads the .pcf and rebuilds each system inside Blender as geometry nodes. Not a baked point cloud, not a video: emitters emit, forces push, sprites face the camera and play their sheets, and every parameter the original author tuned is exposed in a panel.

Requirements

  • Blender 4.2 or newer, the minimum the add-on declares
  • Nothing else. It reads .pcf, .vtf and .vmt files directly: no SourceIO, no VTFEdit, no converters
  • It finds your SFM install through Steam. If yours lives somewhere unusual, set it in Dev > Configure, the add-on preferences, or the LOAD button in Dev > Wiring
  • Optional: SFM Session Importer, the twin add-on, to bring whole sessions in with their effects
Demo a full .pcf import, start to finish
render_rope Valve beams as living geometry

What comes across

  • The full system

    Emitters, initializers, per-frame operators, forces and constraints are rebuilt as working geometry nodes. Nothing is baked.

  • All three renderers

    Camera-facing animated sprites, ropes and beams (render_rope), and velocity-stretched trails (render_sprite_trail).

  • Textures

    .vtf sprite sheets and .vmt materials are decoded directly, including $additive, $overbrightfactor and sheet sequences.

  • Control points

    Imported as empties. Drag one and the effect follows, the same way it follows control points in SFM.

  • Editing after import

    Every parameter the .pcf authored appears in a properties panel, organised by SFM's own sections. Changes apply to particles already in the air.

  • Node to Code

    Export a built system as a script anyone can run with no add-on installed, as Geometry or Shader nodes, with or without embedded textures.

  • Performance tools

    Proxy View swaps heavy effects for cheap colour-coded stand-ins, and a diagnosis button reports what is actually causing viewport lag.

  • Tools without importing

    Calculate Size reads how big an effect gets straight from the .pcf. Import VTF and VMT, build a renderer by hand, a Hammer-unit grid, PCF Preview cards.

  • PRINT HELP

    One report file to send when something breaks: every failure with the .pcf, system and stage it happened in, the Wiring check and the console. Copy Console Output is still one click away.

Tested against real effects

Tested against the hundreds of custom particle systems I have built for supporters over the years: nearly all of them import and play correctly. v0.23.0 was verified against 2,243 .pcf files / 30,616 particle systems from TF2, HL2, Portal 2 and the HoovyTube packs on Patreon.

How to import SFM particles into Blender

  1. Install Blender 4.2 or newer

    That's the minimum the add-on declares.

  2. Download the .zip

    Get v3.0.7. Don't unzip it.

  3. Drop it into Blender

    Drag the .zip onto any Blender window. Blender offers a Legacy Add-on install: keep Enable on Install ticked and press OK. (Edit > Preferences > Add-ons > Install from Disk does the same.)

  4. Build an effect

    Press N, open HoovyTools > Source Particle Import, Browse to a .pcf, pick a system ([6 children] means six more ride along), press BUILD THIS SYSTEM. Press play. Click a built system and the Props tab shows every variable, section by section.

Where to find it in Blender
3D View sidebar (N) > HoovyTools > Source Particle Import
File > Import > Source Engine (.pcf)

The node graph, colour-coded by job

Open an imported system in the node editor and the graph is organised the way Source organises particles. This is Valve's own anatomy, kept on purpose: if you have used SFM's particle editor, you already know your way around.

  • Time: the clock. SFM's timeline runs at 24 FPS; a time-scale group retimes it to your scene.
  • Emitter: when particles are born, and how many.
  • Initializers: values decided once, at birth: position, radius, colour, lifetime.
  • Operators: values recomputed every frame: movement, fading, spin, forces.
  • Sequence maths: which tile of the sprite sheet each particle shows.
  • Renderer: turns the data into camera-facing cards.

Under the hood: the geometry-node machine

The emitter

Thirty times a second the emitter computes how many particles to spawn. Fractional amounts carry over to the next tick (a rate of 2.5 spawns two now and banks the half), so long-run counts match what the author tuned. The particle cap throttles emission; it never deletes a living particle to make room. When the population is full, emission waits for a natural death.

Memory and recomputation

The simulation zone stores four values per particle: ID, birth time, birth position, and one flag. Everything else (size, colour, roll, transparency) is recomputed every frame as a function of the particle's ID. Change Radius while the effect plays and particles already in the air update immediately. Nothing is baked, so nothing needs re-baking.

Deterministic randomness

Random values come from a hash of the particle ID (fract(sin(id × 12.9898 + 78.233) × 43758.5453)), not from a random number generator. A given particle rolls the same values every time it is asked, which is what makes the timeline scrubbable in both directions.

Source's clock and units

Source applies drag per 30 Hz tick, not per second, and the graphs reproduce that: terminal velocity works out to gravity ÷ (30 × drag). One Blender unit equals one Hammer unit, and no value is rescaled on the way in, so effects hold up next to Source-scale characters.

The renderer

Each particle is a card, and its facing mode comes from the .pcf: full billboard (smoke), erect (fire: yaws to face the viewer, stays upright, takes no roll), or locked to a control point's rotation. Mirror flips are a negative X scale on the card. One material serves the whole sheet; each particle selects its sequence through a per-point attribute the shader reads.

The graph documents itself

Every section of every generated graph carries a written note in a coloured frame: what the section does, how, and which traps it avoids. The documentation lives inside the node editor, next to the nodes it describes.

Release notes

v3.0.7LatestNov 2026
  • A build that runs into a problem finishes. An effect with a missing material stopped at the very end with an error, on every Blender. It now builds and reports the problem.
  • Blender 4.2 - 4.5 build the same effects as 5.x. Random ranges, seeds and integer compares reached the wrong node sockets on 4.x; effects came out flattened or in the wrong place. Every socket now matches 5.x.
  • Proxy View stand-in cards are scaled, not turned.
  • More than one SFM on the computer: the install the .pcf sits in is used first, and materials are looked up in every mod folder of every install.
Read moreRead less

The headline fix is embarrassing in the way only one line of Python can be. An import tucked inside the camera branch of the build operator made Python treat the logger as a local name for the whole function, so every build that had something to report, a missing material being enough, reached the very last line and died with UnboundLocalError. On every Blender, for every such effect. The import is gone; the build now finishes and tells you what it could not find.

The second fix is for Blender 4.2 to 4.5. The node builders count sockets the way Blender 5 does, and Blender 5 quietly renumbered a few nodes: Random Value and Compare keep only the sockets of the chosen type, and Transform, Curve to Mesh, Capture Attribute and the Principled BSDF each gained one. On 4.x the same numbers reached other sockets: random ranges landed in unused vector inputs, seeds and IDs were never connected, 422 integer compares compared nothing. Mostly without an error. Every node type the add-on makes was measured on both versions, and all 24,646 socket writes and links in a test set now reach the same socket on 4.3 as on 5.2. A discharge effect that rendered as a flat smear on 4.3 now matches 5.2 particle for particle.

Along the way: the Proxy View stand-in cards were being rotated by one radian per axis instead of scaled, because socket 3 of Transform is Rotation in Blender 5. And with more than one Source Filmmaker on the computer, the add-on no longer simply takes the first install Steam reports; it prefers the one the .pcf sits in, then the one SFM Session Importer is set to, then the one holding the most, and looks for materials in every mod folder of every install.

v3.0.2Oct 2026
  • Forces run on the same clock as gravity. Random Force, Pull towards control point and twist around axis took one extra step every frame: a Random Force of -950 stopped a 365 u/s launch at 34 units, where Gravity -950 stops it at 70. Both now reach 70.1 units at any frame rate, so sparks and debris rise and fall the way the file says.
  • Rotation Yaw Random spins a card locked to a control point (orientation 2) in its own plane instead of squishing it, and reads Yaw Initial and Yaw Exponent from the file.
  • New operator: Remap Percentage Between Two Control Points to Scalar. Where a particle sits between two control points, remapped into radius or alpha: how many beams taper from thick to thin. It was skipped before, so those beams drew at full width.
Read moreRead less

Forces were running one step ahead of gravity. Random Force, Pull towards control point and Twist around axis each stored their result and then read it back a moment later, already updated, so they applied one extra step of force every frame. The tell was arithmetic: a Random Force of -950 stopped a 365 units-per-second launch at 34 units, where Gravity -950 stops it at 70.1, which is also what the physics says. Both now come to 70.1, at 24 and at 60 fps, and a free fall under the force matches a free fall under gravity frame by frame. Sparks rise a little higher and fall a little slower, as written.

Rotation Yaw Random turned out to be in over a thousand systems of the test library rather than the handful the notes claimed, so it got proper treatment: on cards locked to a control point it now spins the card in its own plane instead of squishing it, and Yaw Initial and Yaw Exponent are read from the file. Remap Percentage Between Two Control Points to Scalar, which tapers beams from thick to thin, is built at last; before, those beams drew at full width the whole way.

v3.0.1Oct 2026
  • Loads without Pillow. A Pillow installed for another Python (another Blender, a system Python, or Load Previous Settings carrying scripts\modules over) stopped the whole add-on with cannot import name '_imaging' from 'PIL', and SFM Session Importer's particles with it. Now only the preview cards need Pillow.
  • Ensure PIL (Tools > PCF Preview > 4.3) installs Pillow with your Blender's own Python, so it always fits. About 7 MB from PyPI, once; no restart.
  • Dev > Wiring says whether Pillow is broken or missing, with a REPAIR / INSTALL button. Create PCF Preview and Whole Folder install it on their way the first time.
  • A Text Editor version, Ensure PIL (V1).py, for when the add-on can't load at all: open it in Blender's Text Editor and press Run Script.
Read moreRead less

Pillow, the image library the PCF Preview cards are drawn with, has a habit of being installed for the wrong Python: another Blender, a system Python, or a Load Previous Settings that carried scripts\modules along. Blender then finds it, tries to load its compiled half, and fails with cannot import name '_imaging'. Until 3.0.1 that stopped the whole add-on from loading, which is a lot of consequence for a thumbnail.

Now the add-on loads regardless and only the cards wait. Ensure PIL installs Pillow with your Blender's own Python, so it fits by construction, about 7 MB once and no restart. Dev > Wiring says whether Pillow is broken or missing, with a button for each, and for the case where nothing loads at all there is a Text Editor version that does the same job from a plain script.

v3.0.0Oct 2026
  • The HoovyTools sidebar tab, shared with SFM Session Importer, with a ribbon for every tool: its name runs it, the arrow unfolds its settings.
  • Calculate Size: how big an effect gets, read from the .pcf without importing it.
  • Match .blend reads your scene's frame rate, Start Time follows the playhead, and a scene with no camera gets one, framed on the effect.
  • The Hammer unit grid, simplified: thin lines, 16 units a square.
  • Dev tab: Wiring, PRINT HELP, Configure, Credits and Developer Mode. Every console line starts with [Source Particle Import].
Read moreRead less

3.0.0 moved the add-on into the HoovyTools sidebar tab it shares with SFM Session Importer, and gave every tool the same shape: a row whose name runs it, an arrow that unfolds the settings the next press will use, and a mark that says how the last run went. Calculate Size estimates how big an effect gets without importing it, from spawn radius, speed with drag applied per 30 Hz tick, gravity and random forces: an upper bound, since turbulence and attraction only ever pull particles closer.

Match .blend reads your scene's frame rate instead of assuming SFM's 24, Start Time follows the playhead, and an import into a scene without a camera gets one, framed on the size estimate. The Hammer grid lost its clutter: thin lines, 16 units a square. And the Dev tab arrived with Wiring and PRINT HELP, plus a console where every line starts with [Source Particle Import], so it can be found among everything else Blender prints.

v0.23.0Aug 2026 · 2.0.0 on GitHub
  • Uneven sprite sheets cut correctly. Sheets whose frames are different sizes are now cut by each frame's exact rectangle from the VTF. This covers over 2,000 systems in the wild, including Valve's own blood, fire and impact effects. Big sheets also import faster.
  • Trails point where they fly. Spark trails stretch along their actual flight path, like SFM.
  • Missing materials no longer leave holes. A system whose material can't be found wears a bundled generic (glow, spark or beam) instead of vanishing, and the console says so.
  • Node to Code, four flavours: Geometry or Shader nodes, with or without embedded textures.
  • Copy Console Output: a paste-ready support report in one click.
Read moreRead less

Some sprite sheets do not use a grid. Their frames are different sizes, packed wherever they fit, and the VTF carries a table with each frame's exact rectangle. 0.23.0 reads that table instead of assuming even tiles, which fixes over 2,000 systems in the wild, Valve's own blood, fire and debris among them. Spark trails now stretch along the direction they actually fly rather than a fixed axis.

A system whose material cannot be found used to become an invisible driver: correct motion, nothing to look at. It now wears one of three bundled generics, a soft glow, a spark streak or a beam, chosen by renderer, and the console says which one stood in. Node to Code learned four flavours, and Copy Console Output turns the log into a support report in one click.

v0.22.2Aug 2026
  • Missing geometry, fixed. Systems whose material or texture didn't resolve now build as invisible drivers that still carry their child particles.
  • Sheet preview, fixed. UnlitGeneric sprite sheets preview one frame instead of the whole strip.
  • Install, fixed. Drag-and-drop onto Blender 4.2+ no longer errors with "ZIP packaged incorrectly."
Read moreRead less

Three fixes, each for something that looked like a different problem. Systems whose material did not resolve vanished along with their children; they now build as invisible drivers that still carry the particles parented to them. UnlitGeneric sprite sheets previewed as the whole strip at once; they now show one frame. And dragging the zip onto Blender 4.2 or newer complained that it was packaged incorrectly, which was true, and is no longer.

v0.21.0Baseline

Baseline public release: full .pcf import as live geometry nodes, all three renderers (sprites, ropes, trails), Node to Code, and the performance tools.

Read moreRead less

The first public build. A .pcf came in as live geometry nodes rather than baked geometry: every system a node graph you can open, read and change, with the emitter, initializers, operators and renderer laid out the way Source itself organises them. All three renderers worked, animated sprites, ropes and trails, along with Node to Code and the performance tools. Everything since has been about making more of the world's particle files come out the way SFM draws them.

Previous versions

Older builds stay available here and on GitHub Releases. The latest version is the one to start with.

  • Particle Import v3.0.2

    Oct 2026.zip, 9.9 MB

    Download
  • Particle Import v3.0.1

    Oct 2026.zip, 9.9 MB

    Download
  • Particle Import v3.0.0

    Oct 2026.zip, 9.8 MB

    Download
  • Particle Import v0.23.0

    Aug 20262.0.0 on GitHub.zip, 655 KB

    Download
  • Particle Import v0.22.2

    Aug 2026.zip, 590 KB

    Download
  • Particle Import v0.21.0

    Baseline release.zip, 1.1 MB

    Download

Acknowledgements

Blender Source Tools and SourceIO built the road between Source and Blender; this add-on adds the missing lane. Written by a long-time user of both, in the same spirit: free, and made so SFM artists keep more of their work when they move.

Documentation

Reports and standalone tools

The same in both add-ons. The full manuals live in each repository's README: SFM Session Importer, Source Particle Import.

Printing a log report

When something goes wrong, one text file says what happened. This is how to make it.

  1. Open the Dev tab

    The small button at the right end of the add-on's tab row.

  2. Unfold Behavior Report

    The first line says which version you are on.

  3. Press PRINT HELP

    It writes __<Add-on> Log Report Data__ (V1).txt into the add-on's _Logs folder and opens it. Each press writes the next number, so earlier reports stay.

  4. Send that file

    With a sentence on what you did and what happened.

It holds what is wrong in plain words, the Wiring check, the settings, the last imports, the console and the newest log. If the checks find nothing, the file says so and still carries everything else, because "nothing found" and "nothing wrong" are not the same thing.

The report contains file paths from your computer, which include your Windows user name. Read it before posting it anywhere public.

Particle Import also has, under Behavior Report > Logs: Write Log File (_Logs/Source Particle Import_<date>.log), Errors (Popup, Status Bar or Console Only) and Copy Console Output.

The standalone tools

Both Tools tabs work on single files, with or without anything imported. Each tool is one row: its name runs it, the arrow on the left unfolds its settings (exactly what the next press will use), and a symbol on the right says how the last run went.

  • Session Importer > Main Tools: Import Model (.mdl), Import Animation, Import Shape Keys, Import Camera (.dmx), Import Particles (.pcf)
  • Session Importer > HoovyTools Importers: Import MDL, Import VMT (added to a selected mesh), Import VTF (sprite sheets included), each on a preview sphere. None needs SourceIO
  • Particle Import: Create Renderer System, Import VTF / VMT, Set Scale (Hammer grid, camera), PCF Preview, Particle Size, Share What You Made (Node to Code), Performance (Proxy View)

Calculate Size, step by step

Pick the .pcf on the Import tab, open 5 Particle Size, press 5.1 Calculate Size. Width, depth and height appear under the row, in Hammer units and metres: an upper bound, since turbulence and attraction only keep particles closer.

Text Editor versions

Some tools also come as a plain script that does the same job, for batch work or for reading how it is done. Dev > DEVELOPER MODE (the last button) adds a folder button to those tools. Open the script in Blender's Text Editor, fill in the line at the top (for example VMT_FILES = [r"C:\path\to\material.vmt"]) and press Alt+P.

SFM Detective is one of them: a folder finder that needs nothing else, not even Blender. It finds every Source Filmmaker install on the computer and, given a session, every model it uses and where each one is, or that it is nowhere. Its folder button is on Dev > Wiring > Where It Looks.

More HoovyTools

What else is in the toolbox

In progress

HoovyTools: Blender to SFM

An automatic Blender to SFM importer is under construction. Join the newsletter to hear when it drops, along with new videos, asset drops and HoovyTools updates.

HoovyTools Blender to SFM importer badge

On YouTube

HoovyTools: SFM Transposition Addon

The 600+ animations in The full library tier are fully transposable with it. This site has no download for it; the tutorial shows it in action.

Tutorial SFM How to: Animation Transposition (Addon)
Answers

HoovyTools FAQ

Is HoovyTools free?

Yes. Both add-ons are free downloads from this page, with no paywall. Credit is appreciated, never required. If HoovyTools saves you time, the SFM asset library on Patreon is the way to support HoovyTube.

Can Blender open .pcf particle files?

Not on its own. A .pcf is Source's particle format and Blender has no reader for it. HoovyTools Particle Import adds one: it parses the .pcf and rebuilds each system as geometry nodes, so the effect plays and stays editable.

Do I need SourceIO, Blender Source Tools or VTFEdit for SFM particles?

No. Particle Import is standalone. It decodes .vtf textures and .vmt materials itself, so no converters or other add-ons are required. SourceIO and Blender Source Tools remain the tools of choice for models and maps.

Which particle effects work?

TF2 and SFM stock effects, and custom .pcf files. The importer was tested against hundreds of custom particle systems, and nearly all of them import and play correctly. Version 0.23.0 was verified against 2,243 .pcf files holding 30,616 particle systems from TF2, HL2, Portal 2 and the HoovyTube packs.

What does the session importer need?

SourceIO, installed and enabled first, and your SFM usermod path set in the add-on preferences (the folder that contains gameinfo.txt), so models, materials and sounds resolve the way they do in SFM.

Which Blender version do I need?

Each add-on declares its minimum Blender version in its metadata. Particle Import (v0.23.0) declares Blender 4.2. The session importer (v1.3.1) declares Blender 5.0.1.

Is there a Blender to SFM tool?

An automatic Blender to SFM importer is under construction. Join the newsletter to hear when it drops.

Where can I get SFM assets to use with HoovyTools?

Free items are on the HoovyTube Steam Workshop. The library of 900+ particle effects, 600+ animations and 30+ scenebuilds is on Patreon; memberships start at $20/month.