Table of Contents Show
How do you make a 3D skeleton look as though it belongs inside an oil painting? In Hisko Hulsing’s Danse Macabre, the answer runs through Blender, Houdini, EXR passes, Stable Diffusion, painstaking TVPaint retouching and a rather formidable Fusion node graph. The goal was never perfect photorealism. It was to make every pixel behave like Hulsing’s brushwork, even when the orchestra consisted largely of bones.
For the five-minute animated short, set to the Allegro from Shostakovich’s Tenth Symphony, Hulsing painted an apocalyptic nightmare of war and human suffering, with 75 oil paintings forming the visual basis for the film. The project also encompasses oil paintings and orchestral performances. The film premiered in competition at Annecy in 2026. We spoke with compositing supervisor and technical director Stijn Calis about the very practical craft behind its painterly result, from turning 90 MB EXRs into manageable passes to making reflected skeletons obey the painting rather than the laws of optics.

The film, the paintings and the person in the comp
DP: Before we follow the nodes, what exactly is Danse Macabre?
Stijn Calis: It is a five-minute animated short written, directed and painted by Hisko Hulsing, based on the Allegro from Dmitri Shostakovich’s Tenth Symphony. It is part of a multimedia project with oil paintings and orchestral performances. The film combines those paintings with 2D and 3D animation and AI-assisted textures for the 3D animation. Hisko wanted something “extraordinary, beautiful, intense and frightening”. It took a large international team of animators, riggers, lighters, compositors and effects artists to get there.
The production involved Valk Productions, Autour de Minuit, Vivi Film and Cinemon Entertainment. The handmade imagery is fundamental to the film; the technology had to serve it.
DP: And where did you come in?
Stijn Calis: I was the compositing supervisor and technical director, working for Vivi Film through my studio Skerm West. I oversaw the work in standalone Fusion Studio, including automated precomps, multilayer EXR and Cryptomatte management, preparation for Stable Diffusion, custom Fusion tools and some hand-offs to other artists. During the last three months, I took on each individual comp myself to deliver Hisko’s vision. I also completed the final online in DaVinci Resolve Studio and worked on the film’s overall cohesive look.
My route here was hardly a straight line. I studied Digital Design & Media at Howest, worked at Grid VFX/Animation and VC Studios, co-founded the XR studio Holofarm, supervised technical animation at Submarine on Apollo 10½ and The Sandman, and worked on Titina, Valemon: The Polar Bear Prince and Fox & Hare Save the Forest. These days I also build stories for local clients at Skerm West and teach workshops. The ability to move between artists and pipelines was useful here.
DP: What existed before you could start compositing?
Stijn Calis: Hisko made the storyboards and laid out his oil paintings himself. They already contained a great deal of information about light and composition. In the breakdown shot, the skeleton was part of the original painting, so Hisko first had to paint it out and give us a clean background. We then brought back an independently animated character. The starting point was the painting, not a synthetic environment.


The live-action shoot provided performance references for the animators. The broader making-of also documents the pencil drawings, oil painting, Blender animation and lighting, TVPaint work and final compositing.
From painted layout to reusable Fusion comp
DP: What arrived from the different departments?
Stijn Calis: We built a base comp for all the material. The animated characters came from Blender and Cycles in an ACES workflow. The multilayer OpenEXRs carried beauty, depth, normals, UV, world position, vectors and Cryptomatte passes. We had Hisko’s background paintings too, plus Houdini renders for heavier work such as smoke and terrain destruction. We aligned everything into a technical layout before the final integration.
Fusion handled those EXRs efficiently and reliably. Coming from After Effects and Blender, the advantage for me was how naturally the node graph combines masks. Once you are juggling dozens of mattes, the difference between a node graph and a layer stack becomes rather personal.
DP: How did the Fusion pipeline grow into its particular creature?
Stijn Calis: Most of the skeleton came from my own pipeline, buze, developed over Titina, Valemon and commercials. A Fusion .comp is a readable Lua table, so my CompHack class can open it as text, find Savers named with the svr_ prefix and rewrite paths and frame ranges without launching Fusion. The other habit is a Python builder run inside Fusion, which assembles a shot from published renders, reference frames and layered PSD backgrounds. Nobody starts from an empty flow.
Danse Macabre gave it a proper stress test. Under the working title Resurrection we first made a test shot, then a full vertical slice of shot 090: roughly seventy Fusion 18 comp versions between April and June 2025. That produced a template and PrecompCreator.py. The two additions forced on us were an export branch for the Stable Diffusion hand-off and the ability to inherit shot-specific settings when characters arrived in separate layers. We finished the production comps in Fusion 20.1.

DP: What did PrecompCreator.py actually automate?
Stijn Calis: It scans the 3D render folder, chooses the latest v### for each shot and builds a precomp from the template for every render layer and its paired canny render. It modifies only Loaders with names beginning loader_ and Savers containing svr_, replaces the shot and layer tokens and updates paths, clips and timing. For layered shots, it copies values such as Cryptomatte selections and the Low/High range of the DEPTH_NORMALISE mask from an existing precomp.
It edits the .comp as text, so it does not need to open Fusion. The dangerous part is also obvious: an incorrect inherited setting propagates every bit as efficiently as a correct one. Matte selection and visual checking stayed manual. Automation saved the repetitive work, not the responsibility.
Cryptomattes, canny passes and the great ProRes hand-off
DP: Where did Fusion’s Cryptomatte tools help, and where did they slow you down?
Stijn Calis: We started in Fusion 18 with the Cryptomatte Fuse from Reactor. It was made by Cédric Duriau and Kristof Indeherberge at Grid, with Andrew Hazelden, former colleagues of mine. You could use a locator to pick an object, but doing that for many material names across shots took time. When Fusion 20 arrived, its native Cryptomatte tool let us browse a list of materials. That was the old manual practice finally being shown the door.
We selected mattes for skeletons, weapons, boots, clothing, helmets and smoke. We also made a coloured “clown” preview to see whether everything had a matte. Other Reactor tools in the final comps included td_Kuwahara, OCLRays, XGlow and Wireless.
DP: Which passes actually earned their keep?
Stijn Calis: Each character layer went out as roughly twenty ProRes files: beauty, alpha, grown alpha, depth and inverted depth, normals, UVs, material-specific Cryptomattes, the clown preview and three canny variants. The canny variants were generated from depth, normals and UVs as additional Blender AOVs by Autour de Minuit. Our template note said to use UV canny on every layer, because it was the most useful one from 3D.
The canny and UV passes mainly helped Stable Diffusion. In final comp, alpha, beauty, grown alpha and depth were the workhorses. Normals returned for Fusion’s Relight node in a handful of shots. For depth we set the range in a BitmapMask with Low/High values per shot. Crucially, the data passes stayed as data, without a colour transform.
DP: Why make QuickTimes when you already had multilayer EXRs?
Stijn Calis: Some EXRs were around 100 MB per frame. Stable Diffusion already taxed the machine enough, so we exported the necessary streams as ProRes 422 QuickTimes, typically about 500 MB per shot for the input set. ProRes was widely supported and manageable in memory. Those are rough production figures, not a fixed budget for every shot.
DP: What happened to ACES on the trip through generation and back?
Stijn Calis: The pipeline was a mixture from the beginning. The Harmony 2D animation and Photoshop backgrounds were sRGB. Autour de Minuit delivered Blender renders as ACEScg multilayer EXRs, typically around 90 MB per 4096 × 1732 frame, with Blender’s OCIO config and an example comp. A Fusion OCIOColorSpace node converted the beauty from ACEScg to the AgX Base sRGB view, matching what the lighters saw in Blender.
We pulled down the highlights in a ColorCorrector to avoid clipping and mixed diffuse back over beauty at about 60 percent. That “precompStyled” output went to Stable Diffusion. Data passes skipped the transform. Houdini FX were also ACEScg, but used an ACES 1.3 configuration with the ACES 1.0 SDR Video view. In effect, we had two tone mappers, and compositing had to keep the join invisible.
After that it was display-referred: Stable Diffusion and TVPaint returned 8-bit sRGB, and the Fusion comps ran at 4096 × 1732, 24 fps, in float. A ChangeDepth to 8-bit sat immediately before the ProRes 422 HQ Saver. Resolve delivered a DCP and a Rec.709 master. So sRGB entered at the precomp, while Rec.709 came in at final delivery.
Getting an oil-painted look from moving pixels

DP: Why wasn’t a good Blender render good enough?
Stijn Calis: Hisko found the Blender and Houdini textures too sterile. They lacked the surface and depth of his oil paintings. The animation was split into smaller chunks and processed in ComfyUI with Stable Diffusion and AnimateDiff, using a model adapted to Hisko’s paintings. Hisko then stitched the results together in TVPaint and retouched them frame by frame. The processed images came back to Fusion for integration.
DP: What did Stable Diffusion teach you beyond the first convincing frame?
Stijn Calis: This is partly a question for Stein Louise, the 2D animator running the generation. From what I saw in our production discussions, Stable Diffusion could deliver the painterly texture quickly, but it had a poor memory from one frame to the next. We fed it images about 1024 pixels high, guided by depth, normals and canny lines. The brushwork could boil as a character moved. AnimateDiff and short chunks reduced the problem, but they did not eliminate it.
The division of labour was clear: Stein’s generation supplied the paint, Hisko repaired and stabilised it in TVPaint frame by frame, and Fusion used depth and Cryptomattes to recover the original form where the stylisation drifted. We had used EbSynth on earlier projects too, and even then repairs could take half a day or several days in TVPaint. The newer tool got closer on the first pass; it did not eliminate the finishing artists.
That is why I find the “AI slop” argument too blunt for this particular film. Across years of rotoscope-based animation work, including Apollo 10½ and The Sandman, software has helped animators work faster. The amount of hand-finishing remained substantial. It is a tool in an artist-led pipeline, not an unattended film factory.

DP: What happened when several characters overlapped?
Stijn Calis: Sometimes there were five character layers in a shot. Autour de Minuit supplied them separately so that masking a foreground character did not expose holes in those behind it. PrecompCreator could then inherit the Cryptomatte selections and depth ranges for each layer rather than making me configure them again. The material still needed checking, particularly as settings were copied between precomps.

DP: Did the 8-bit material offend your inner compositor?
Stijn Calis: It improved its working hours. Files were lighter, iterations were faster and it never felt like a compromise. The material was only 8-bit on input; the comps processed it in 16-bit float. A colour corrector could push values above 1.0, and we could bring them back later. The final ChangeDepth converted for ProRes 422 HQ. For this project, light display-referred inputs and a float comp gave us the working headroom we needed. Not every job needs to carry the heaviest possible files all the way through.

The breakdown: when the painting overrules physics
The shot of a skeleton in front of a firelit window is a useful stress test for the whole process. The clean painting, stylised character, animated fire and smoke all arrived with very different histories. The composite had to make their seams disappear.

DP: In the window shot, why wasn’t the processed character already finished?
Stijn Calis: The TVPaint material still looked too CG next to the original painting. Hisko’s painted soldier was more orange, flatter and less contrasty. I kept the painting in Fusion as a reference and graded toward it with Alpha Divide, colour correction and shadow merges. A technically convincing Relight from the normal pass actually took us farther from the painting.
I used Multiply and Normal merges, around 50 and 65 percent, to control shadow density and let the painted colours come through. The stopping rule was a simple A/B comparison with Hisko’s reference: when I could no longer tell which version was rendered, it was done.

DP: How did the fire make the rest of the room react?
Stijn Calis: Hisko animated the fire and smoke in TVPaint, but the room still needed more responsive light. I masked the window and used colour correction to vary the surrounding glow. My master control is a ColorCorrector called ccBoostFire. Corrections on the skull, walls and other surfaces read ccBoostFire.Blend through an expression, with their own masks. That lets them brighten and darken together.
A Shake modifier makes the light flicker, while separate keyframed boosts follow accents in Shostakovich’s score. I often animate light by hand to music. It is a little like conducting an orchestra, except the violin section is on fire. To repeat it: animate the master ColorCorrector Blend, have dependent correctors reference that Blend, constrain each with its own mask and put musical hits on a separate control so they do not fight the procedural flicker.
DP: What did you add to the background?
Stijn Calis: I merged 4K particle elements from FootageCrate for atmosphere and adjusted lighting and contrast on the walls. To bring out the glass, I darkened selected background regions with rough polygon masks combined with keying, including a luma key. Where the adjustment was forgiving, the masks did not need surgical precision. Some regions also responded to ccBoostFire.
DP: And those reflections in the table and wine glass?
Stijn Calis: We reused the character image. For the table, I flipped and trimmed it and used static Fast Noise to drive a Displace, so it picked up the grain of the painted wood. For the wine glass, I used a Dent at roughly two-thirds strength, a blur and a mask. We judged distortion, softness and shadow strength against Hisko’s existing reflections, not a ray tracer. In a locked-off painting, that works. If a moving camera revealed parallax or the shape of a curved surface, I would ask for a proper 3D reflection pass. Sometimes the painter is a better optics department.
DP: What finished the shot?
Stijn Calis: I isolated some fire with a luma key and added a soft glow. Then came film grain and the export. This is the kind of shot where the last five percent is not glamorous, but without it, everything still feels separately assembled.

Shot 090: the test that became a pipeline
DP: Which shot best shows why all this preparation mattered?
Stijn Calis: Shot 090, our first vertical slice. It had rows of skeletal soldiers, a giant skeleton, ground, a shadow catcher and a volume pass. Autour de Minuit delivered separate layers in five rounds between March and May 2025. Just one 64-frame row at 4096 × 1732 occupied about 7.9 GB: 3.2 GB of multilayer beauty, 3.8 GB of technical passes and 0.9 GB of Cryptomattes. The precomp turned that into 23 movie files, about 0.9 GB in total.
Stein made eight Stable Diffusion passes between late April and late May, trying different samplers. The comp went from v001 on 17 April to v070 on 3 June. Version 1 held everything in one file: 32 Loaders, 41 Savers and 37 Groups. In v070 the precomps were separate and the main comp became a reading stage: 42 Loaders, 27 Merges and three Savers. It pulled in the precomp streams, Stein’s stylised frames, the raw ground, shadow and volume EXRs, Hisko’s painting, dust and earlier versions for comparison.
That split became the template for the film. The hardest shot was also the most useful one: it made every later shot possible.

How to hand over a node graph without giving a guided tour
DP: You handled most comps. What could other artists take on?
Stijn Calis: A shot needed angels to become mermaids with cloudlike tails, including masking the wings and legs. I showed the interns one comp, pointed out exactly which BitmapMask needed polygon masks, grouped the relevant tools, added Notes and marked the location to rewire. They had never used Fusion, but they managed the work.
DP: How do you make the flow readable?
Stijn Calis: I work left to right, use Underlays and Notes where useful, fixed loader_ and svr_ prefixes in templates, PipeRouters and colour labels to show which tools people may touch. Follow the path backwards from the Saver, toggle a node and look at the result. That is a surprisingly good way for a newcomer to learn a complex comp. A node graph should be a map, not an archaeological site.

DP: What should somebody test before building a cathedral of nodes?
Stijn Calis: One test shot, then one complete vertical slice. Make it a difficult shot that forces the overlap, Cryptomatte naming, depth ranges, colour and round trip through ComfyUI. Start with beauty, alpha, depth, normals, Cryptomatte and a line pass. Send one layer through generation and back to Fusion. Only then make the template and fix naming conventions, so the builder knows where to put things and a second compositor can help before the deadline becomes a personality trait.
What would change for Danse Macabre 2?
DP: If you could snap your fingers and rebuild the pipeline, what would you change?
Stijn Calis: I would agree on one working colour space and one view transform with all vendors from day one, and let the precomp template read the colour space from each delivery instead of setting it per shot. Then I would bring generation closer to the comp so that stylised outputs returned with their own mattes. I would absolutely keep generating Fusion .comp files as text with Python and linking several colour corrections to one master control. Those are gloriously practical tricks.
I would start directly in Fusion 21 rather than repeat the move from 18 to 20 during production. Fusion 21 improves Relight and Depth Map performance, includes tools for deep images such as the dColorCorrector, a new Macro Editor and metadata features useful for shot and layer tokens. I do not have a long wish list, though. I still love making comps, however big they get.
From lightsabers to Skerm West
DP: How did you end up in visual effects?
Stijn Calis: Through fun. At 17 I made a Star Wars fan film with friends in my parents’ backyard, complete with lightsabers, glowing eyes and a fight scene. It was clumsy, but the bug had bitten. I filmed youth-camp trips, parties and local events, edited birthday tributes and made posters. It was already about using images to bring people together. At Howest, I learned tools such as After Effects and Flash/ActionScript. That programming background later came in handy for Unity and XR work.

DP: What are you working on now, and what is happening to the Belgian production industry?
Stijn Calis: I would still love more film and animation work. The problem is the funding climate, not just the availability of artists. The Screen Flanders incentive is being discontinued on 1 January 2027, even though its own figures show €4.9 million invested in 22 projects in 2025 generating more than €40.2 million in regional production spending. The VRT faces a proposed additional €10 million reduction by 2029 on top of €16.6 million in savings already under way. The Flemish Media and Game Fund was also targeted by cuts, and the French-speaking cultural sector faces reductions. Those decisions have very real consequences for local studios.
The animation industry responded with a joint protest graphic novel. Flanders is confronting a budget problem, but where government chooses to cut is political. I find it frightening when the audiovisual arts are treated as a luxury rather than an industry. I have felt the financial stress myself, so I chose to invest in local projects and people.
DP: Where does that leave your work at Skerm West?
Stijn Calis: I work with companies, schools, hospitals, social organisations and non-profits, even therapists who want to translate their ideas into a visual story. An example is Immuno-T, a digital comic about cancer and immunotherapy for Ghent University and UZ Gent. We started it in 2017 and are now turning it into a physical comic book.
Alongside that, I’m also developing CostCards, a SaaS platform for cost calculation in the maker industry. The idea is not just to calculate costs, but to protect margins and make better business decisions. I’m developing it through Brugge.Inc, a startup incubator in Bruges. These days, that means working with a view of one of the loveliest cities around, while exchanging ideas with other digital creatives who are also trying to build an economically sustainable future.
I use AI in my own work, but I believe in showing clients how much was involved. Our AI charter labels projects as A for handmade, B when AI assists individual steps and C when AI has a substantial role. Transparency matters, especially when artists are doing the finishing.

DP: You tell students not to become a one-task specialist. Why?
Stijn Calis: Learn the whole process. Walk with every department. If you only know one small task, you have fewer ways to make something. I want people to be generalists who understand the whole circus, then choose the role they love. AI can help an animator build a set while the animator concentrates on animating. It is like being handed the whole Lego box. The bad output often comes from people who never mastered the craft they are imitating. The good work starts with curiosity and understanding.
Links and further viewing
Watch the film trailer, Hulsing’s production making-of and Calis’s Fusion shot breakdown. Further production material appears on Hisko Hulsing’s project page, Stijn’s portfolio and Flanders Image. For the older Fusion implementation of Cryptomatte, see the open-source repository. For more on file outputs in Fusion, our Fridays for Fusion guide to Saver tools covers output selection and frame ranges.






