Second Chance GazetteDevlogToken Use

Blocking Wait

unreal-enginematerialsshadershlslmetahumanfabblenderlandscaperoadsclaude-codegta-6

Six editors before ten

It was a Wednesday, so James was at work, and the morning happened on his phone. The agent, Claude Code Opus 5.5, had one job queued from the night before: a hi-vis vest for the bin crew. Fluorescent yellow, two grey reflective bands, the city council's name stencilled across the back and a small crest on the front left. He had specified it the day before. It is the sort of thing a British player sees on a bin man every Tuesday and would notice the absence of in a second.

The morning took three hours, and almost none of it was spent on the vest.

The agent wrote the vest's material from a script, saved it, and the editor stopped answering. A box came up reading Updating Texture Streaming Data 0% and stayed at 0%. Task Manager showed two shader compile workers ticking over at about a quarter of a core each, which looks like an engine doing something slowly and is exactly what an engine doing nothing looks like. The agent reported that it was a shader backlog and that it would clear. It did not clear. Yes kill it, James sent from work, and the agent killed the editor and relaunched it.

That was the first of six.

Each relaunch came with a new theory, stated with the same confidence as the last. First it was the shader workers themselves, starved of memory. Then it was the thumbnail the editor renders the first time any material is saved. Then it was the textures the vest's crest and stencil were drawn from. Each theory came with a test, and each test appeared to pass, because each one took away something that happened to sit in front of the real problem. Bisecting a fault by removing whatever is blocking the view is a reliable way to find the last thing you removed.

Rockstar have a rendering department. James had a phone in his pocket at work, and he used it to type you can do that so the agent could restart the editor again.

The fourth number

The cause, when the agent finally built the vest's material without saving it and read the log, was one character.

A material in Unreal can carry a colour setting that every copy of it can change, and that setting has four numbers in it: red, green, blue and a fourth one, alpha, that the vest used to carry a mask. The vest's master material had a box of hand-typed shader code in it that read that fourth number. But the colour setting's main output only carries the first three. The fourth comes out of its own pin. So the shader code asked for a number that was never handed to it, and the shader never compiled.

Unreal said nothing about this. When a material compiles in the background and fails, the engine quietly draws a fallback and reports the job finished in a few seconds. Anything that has to wait for the real shader, though, waits for ever. Saving the material renders a thumbnail and waits. Recompiling it from Python ends in a texture-streaming build that waits. Both sat there with two workers at a quarter of a core, politely, for as long as anyone was prepared to let them.

The fix was to feed the fourth number in through its own pin. The vest compiled in seconds and saved first time.

James had asked for the crew in plain tees with the vest over the top, any colour. The agent found a short-sleeved tucked tee already fitted to the postman and used that. There was a small trap on the way: a garment whose name suggests a T-shirt with pushed-up sleeves turned out to be long-sleeved under the name. One bin man went charcoal, one navy, one bottle green. The tee's texture lifts every colour it is given, so the dark ones had to be set darker than they look.

Three bin men standing in a T-pose on a blue background, shown from the front on the left and from behind on the right. Each wears a fluorescent yellow hi-vis vest with two grey reflective bands over a different coloured tee - charcoal, navy and bottle green - with orange work trousers and black and orange boots. The backs of the vests read Oakhaven City Council.
The three bin men in their council hi-vis over three different tees, front and back. This is the vest that cost the morning; the material that froze six editors is the one drawing the yellow.

GTA 6 has bin lorries. This has the council's name on the back of the man walking behind one. That is most of what the British half of the argument amounts to, and it took a morning to get there.

Wider bands

The evening was the door staff.

Three men work security in the game. Over the previous two days they had been re-dressed in work shirts from Fab, the marketplace, and James had a list. Dean's buzz cut rendered as bald, because the haircut he had been given has no short strand cards to draw at a distance. He went to a brush cut borrowed from one of the others. All three had ties, and the ties had a floating section that sat a centimetre off the shirt. James looked at them and decided they would look better without ties. That fix took less time than any other on the list.

The one that took longer was small flecks of skin showing through at the chest on two of the shirts. The agent's first attempt pushed the shirt outwards along its own surface direction, 1.2 cm, and tore every seam open and swallowed the name badge whole. 0.4 cm left the flecks. What worked was pushing the torso straight out from the body's centre line, 0.7 cm, faded to nothing at the sides. It took the flecks and some streaks on Dean's lighter shirt with it.

Then the armband. Door staff in Britain wear their licence on a band round the upper arm, and the game's men had none. The agent built one in Blender, fitted to each man's sleeve by reading which arm bones the shirt itself was attached to, and drew the licence holder as the game's own design, with no real regulator's mark on it. James looked at the first version and asked for it twice as wide. The second version is the one in the picture.

Two men in profile on a blue background, one in a black work shirt and one in a white one, each wearing a black band round the upper left arm holding a clear licence holder with a yellow border.
Dean and Lee in profile with the wider licence armband. The first band was half this height and read as a strap.

Somewhere in the armband work James said the obvious thing about the third man, Les: that he looked wrong, and not because of the shirt. The agent had said it was the shirt. It was not. Clothed characters are built with the skin under their clothes cut away, to save drawing it, so a body fault is invisible until the clothes come off. James said as much: their bodies are culled so I can't tell.

The shape he came with

The agent built bare copies of all three men, no clothes, nothing cut away, and shot them from the front and the side. Les had a large stomach on a narrow chest. The reason was in his body settings. When he was first made, three of his measurements, chest, neck and the width across the front of the shoulders, had been copied across from one of the bin men and pinned there. The sliders that are supposed to make a character heavier or more muscular were moving against fixed numbers. They had nowhere to go.

The agent unpinned the body in one pass and set every measurement to match Dean's in another. Both moved Les by a centimetre or two. By its seventh pass it was reporting that the body state was corrupt, and that the only real cure was to rebuild him from his original preset and run the paid cloud rigging stage again, which needs James at the mouse. He had already said no to the agent driving the mouse in the editor that day.

At eleven at night James looked at the before and after sheets and said to keep the three as they are. Then he made it a rule: every new NPC gets built bare first and checked for a realistic physique from the front and the side, before anyone dresses it. That went into the project's notes the same night. The bodies themselves were put back from a backup, byte for byte.

A hundred and five free motion capture clips also went into the project that evening, walks and gestures and work actions. They are in, and fitting them to the town's characters is the next job.

A hill moved

A second session of the agent had been on the same editor all evening, which is why some of the door-staff work queued behind it. It was building a new part of the map: an upmarket estate of big Victorian and Edwardian houses behind high walls, drawn from photographs of real streets and from estate agents' listings for six real areas James picked. He wants the North and the Midlands to read as places with money in them as well as places without.

By the start of the evening it had seven landmark houses, ten ordinary house types and twenty-four pieces of street furniture, all modelled in Blender from scripts so any of them can be rebuilt from scratch. James approved every one of the forty-one without a change. All forty-one imported first time, within a centimetre of their Blender sizes.

A large detached house rendered in Blender on flat green ground: red brick ground floor, black and white mock-Tudor timbering above, steep red tiled gables, tall chimneys with terracotta pots, a bay window and a pale driveway in front.
One of the seven landmark houses, a mock-Tudor manor, as approved. Every one of them is generated by a script rather than modelled by hand.
A close view in Unreal Engine of the corner of a red brick house on a black background: textured brickwork, a stone plinth and stone bands, and dark sash windows with pale frames.
The same kit inside Unreal, close up on a Gothic villa's corner, with the brick and stone materials on.

The estate needed two new kinds of road, an avenue and a narrower road, each with a grass verge between the kerb and the footway, which no road in the game had before. The profiles came out of Blender and went into Unreal at the scale every other import in the project uses, and arrived a hundred times too small. This exporter writes its files in a different unit from the old one. At full scale both roads painted cleanly on a test map, and the new street lamp for them, a gas-style lantern, takes its colour from photographs of real gas lamps. Its brightness comes from James, who has stood under them and says they light the whole street.

Then the ground. The site was a run of knolls that the plan called for levelling to a gentle, parkland roll. James chose how far. The agent worked out 845 strips of earth to move, 1.14 million cubic metres of cut and the same again of fill, with the deepest cut 41.6 metres. It carved them in three batches in thirty-four seconds and checked 45,040 points of the new ground afterwards: none more than 3 cm from the design. Three things stood on ground that moved, an oak and two perches for the birds that land in it. They went down 24.19 metres with it.

An aerial editor view across rolling green ground towards a town on the left, with white-lined roads, a roundabout, a large pale industrial building with a chimney and an oval racing track. The foreground is a broad smooth slope where hills have been levelled. Orange selection outlines cover the town and a red engine warning about video memory runs across the top.
The levelled site from the air, looking back towards the town. The smooth slope in the foreground used to be hills. The red line across the top is the engine complaining about video memory, which it does whenever the whole map is in view at once.

The houses are next. They will not sit flat on it yet; across their footprints the ground still falls by up to 2.8 metres. The session handed over at half eleven at night.

The fault

Unreal Engine 5.8 editor hangs on "Updating Texture Streaming Data 0%" and on saving a new material

A master material built from Python appeared to freeze the editor. Saving it, or calling MaterialEditingLibrary.recompile_material on it, never returned. Two ShaderCompileWorker processes sat at about 25% CPU for hours. No error dialog, and the background compile reported itself finished in seconds.

Wrong guesses, in order, each "confirmed" by a test that removed something in front of the real cause:

  • shader workers starved of memory
  • the thumbnail render on first save
  • the source textures

Cost: about three hours and six editor kills.

Actual cause: a Custom (HLSL) node read .w from a VectorParameter. A VectorParameter's default output pin is RGB, a float3, so .w does not exist and the shader never compiles. An asynchronous compile silently falls back to the default material. A blocking wait on the real shader (the save's thumbnail, and recompile_material, which ends in BuildTextureStreamingData) waits indefinitely.

The fix

Feed the fourth channel through the VectorParameter's A pin

Wire the parameter's A output into the Custom node as its own input and read it there, instead of reading .w off the RGB pin.

The guard: when a new master material "hangs on save", test it for compile errors first. Build it without saving and search the output log for Failed to compile Material before suspecting workers, thumbnails or textures. Prefer one notified property write over recompile_material, which also builds the texture-streaming debug shaders.

The fault

Fab shirt shows skin through the chest, and a push along normals tears the seams

A parametric MetaHuman shirt from Fab showed small flecks of skin at the chest. Inflating it along its vertex normals in the material (World Position Offset) by 1.2 cm opened every seam and swallowed the badge. 0.4 cm left the flecks.

The fix

Push the torso out radially from the body's centre line

Offset the torso region radially from the vertical centre line (0.7 cm), fading to zero beyond about 17 cm either side and outside the chest band. Seams stay closed because both sides of a seam share one radial direction where their normals do not.

The fault

MetaHuman body barely changes with the Fat and Muscularity sliders

Seven passes at reshaping one character's body moved it by 1-2 cm. Three torso girths (Chest, Neck Base, Front Interscye) had been inherited from another character and left pinned, so the archetype sliders were working against fixed measurements. With the torso girths pinned, Fat and Muscularity changed nothing visible at all.

The fault was invisible in normal previews because a clothed build culls the body under its garments.

The fix

Check the bare body, front and side, before any dressing

Build a garment-less duplicate (a duplicate keeps the rig, so it is free) and shoot it from the front and the side before any clothing work. Read the body constraints with their active flags. Any girth pinned beyond Height, Fat, Muscularity and the masculine/feminine blend is suspect. A corrupt body state is fixed by rebuilding from the preset, before dressing rather than after. A body edit does not invalidate the rig on UE 5.8.

The fault

Road-profile FBX imports 100 times too small in Unreal Engine 5.8

Two new road cross-sections exported from Blender came into Unreal a hundredth of their size, at the 0.01 import scale every other mesh in the project uses.

The fix

Match the import scale to the exporter, not to the project habit

These files were written in centimetres by a newer exporter that does not double-scale, so they take import_uniform_scale 1.0. Check the imported bounds against the source width (14.85 m and 12.25 m here) on every first import from a new exporter.

The kit

ToolWhy this one
Unreal Engine 5.8 output logwhere Failed to compile Material was all along
Blender, driven by scripts41 estate meshes, the armband, and the road cross-sections, all rebuildable from scratch
Fabthe parametric work shirts the door staff wear
Claude Code on the phonethe morning's six restarts were approved from work
Photographs of real gas lampsthe lantern's colour; James supplied the brightness

Plain English

TermWhat it means
master materialThe one material a family of surfaces is built on; every instance of it inherits its logic and only changes the settings.
Custom nodeA box in a material graph where you type shader code by hand instead of wiring ready-made boxes together.
HLSLThe programming language Unreal's shaders are written in on Windows.
vector parameterA colour or four-number setting on a material that each instance can change; its main output carries only three of the four numbers.
shaderThe small program that actually draws a surface. New materials must be compiled before they appear, which is why a change can take minutes to show.
shader compile workerA helper program the editor starts to turn materials into shaders in the background, so the editor itself does not stall.
MetaHumanEpic's system for realistic human characters - face, body, hair and clothing, ready to animate. Every named person in the game is one.
parametric garmentA MetaHuman garment that is re-fitted to each character's body shape when the character is built, and hides the skin underneath it automatically; the alternative is one fixed shape that only fits the body it was made on.
FabEpic's marketplace for ready-made game assets - models, materials, characters, clothing. Buying a garment and refitting it is how almost everyone in this game got dressed.
World Position OffsetA material setting that nudges a model's surface points to new positions as it draws, without touching the model itself - used here to fold a shirt hem under a waistband.
motion captureAnimation recorded from a real person moving in a suit of sensors, rather than posed by hand.
cut and fillReshaping ground for building: cut the high bits down, fill the low bits in, ideally so the two roughly balance.
landscapeUnreal's ground system - the sculpted, painted terrain the town sits on.

Things we still need to fix tomorrow:

  • The houses go on the new estate next, on flat pads, because the ground still falls up to 2.8 metres under some of them.
  • Painting the estate's roads into the real map, then the lamps, trees and the navmesh.
  • The gas lamps at night: the glass may read too white, and the lumens need raising.
  • Fitting the 105 new motion capture clips to the town's characters. Which NPCs get them is James's call.
  • Residents stuck at their own doors on a few routes, and the pub bingo's error flood: the bingo fix is compiled, and a long play session to count the errors is next.

← All devlog entries

Watch it get built. All of this goes up on YouTube as it happens - broken animations, buildings hovering a foot off the ground, the lot.

Subscribe on YouTube