Atmosphere tests

43 of 43 passed · each test's latest run, 2026-10-14 15:02 to 2026-10-15 18:23

Performance

✓ All measurements within their limits.

Test system

GPUNVIDIA GeForce RTX 2080 Super with Max-Q Design
CPUIntel Core i7-10875H @ 2.30GHz, 16 threads
Memory15.9 GB
Windowsbuild 19045
Game window1920 x 1080, windowed, multisampling 2x, vsync off
ClientWorld of Warcraft 1.12.1.5875, DXVK
comfyatmos.dllv0.15.0-alpha, built Oct 15 2026 18:59:45
comfyatmos.ini345 settings

comfyatmos.ini

The settings file of the test client, as the tests ran with it. A test's own Atmosphere controls (its test settings) are applied over the matching values here.

[fog]

The fog: thick at the ground and thinning upward. It darkens what lies behind it and is lit by the sun and by the sky. Needs [depth] enabled. With [volume] enabled it is drawn with the volumetric light, and shows shafts where things shade the sun. With [volume] enabled = 0 it draws alone, with no shadow map: the sun lights all of it, as at Volumetric Light Strength 25. The game's own fog stays, as the far wall.

enabled1
density0.0025fog per yard at the ground. 0.0025 lets through 60% of what is 200 yards away
height25yards: the fog thins by 2.7 times every this many yards up
groundRadius150yards around you the ground under the fog is averaged over (the map files)
reach200yards: how far a line of sight gathers fog. It fades out over the last 40%; past it the game's own fog is the far wall
skyDistance75yards: the same for a line of sight to the sky (0 = the sky gets no fog)
brightness1.2the sky's light on the fog: the game's fog colour times this
sunLight4.0the sun's light on the fog, against the air's. Volumetric Light Strength sets both
toward0.30..0.9: how much brighter the fog is looking toward the sun, and darker looking away; 0 = the same from every side (Fog Toward the Sun, as a percentage)
horizonGlow10..2: the fog's glow along the horizon with the sun low, brightest under the sun; 0 none (Fog Horizon Glow, as a percentage)
patchiness0.50 = an even fog; 1 = thick patches with clear air between
scale60yards: how big a patch is
flatten2patches are this many times wider than tall
windDeg45the way the wind blows the patches: 0 north, 90 east
windSpeed1.5yards a second
follow0.50 = the fog lies on the ground smoothed over smoothRadius, so it fills valleys; 1 = on the ground itself, as thick on a hilltop as in the valley below
smoothRadius100yards
lowGround1.5the fog this much thicker again where the ground lies lowDepth yards below the
lowDepth25smoothed ground around it: valleys and hollows. Ground higher than this above a point (a mountain, a city wall) counts as this high in its smoothing
water2.1this much thicker again over rivers, lakes and the sea. Over low water the larger of the two counts, not both
morning1.0this much thicker at dawn (6:00), and half of it at dusk (20:00)
lampMist0.5a lamp's glow in the air this much brighter for each time the ground's fog thickness around it. The fog between you and a lamp dims it either way
debug01 = the transmittance (white = clear); 2 = the sky's light on the fog alone

[sun]

Where the sun is, for the shadow map and the volumetric light. By default it is the sun the client draws in the sky, so the light follows the time of day.

fixed01 = a fixed sun at azimuth/elevation below, whatever time the game says it is, for testing in the same light every time
azimuth45degrees; the defaults are the afternoon sun the sky showed while this was tuned
elevation50
glide3seconds at least that the sun takes to follow a step of the sky (Sun Smoothing). The sky steps once a game minute, and each step is followed at a steady speed over the time since the last one, so the shadows move on all the time. 0 = at once

[client]

Where the client keeps the camera and the player (the same addresses comfygrass uses). Shadows and volumetric light read them. Another WoW.exe build moves them.

camAddr0x00C7CF20
objMgrAddr0x00B41414
playerPosOff0x9B8
clockAddr0x00CE9B64the game's time of day, for [night] (the address [time] writes)
mapNameAddr0x00C961A0the current map's folder name, for [shadow] mapTerrain

[depth]

A depth buffer the shaders can read (the INTZ format) swapped in for the client's. The volumetric light reads it. Off by default.

enabled1
seeThrough11 = a see-through model (a stealthed unit) writes no depth, so the shadows and the light do not outline it; 0 = as the game draws it
seeThroughNear4yards: not while the camera is this near your character. Zoomed in, the game fades your character the same way, and its face showed through the back of its head
seeThroughNearMounted15yards: the same while you ride a mount. The game fades the larger model from farther off, and the far side of the horse showed through
waterDepth11 = the water writes depth, so the sun shadows and the light see its surface; 0 = as the game draws it (they see what lies under the water)

[shadow]

A shadow map from the sun: the frame's solid world (terrain, buildings, trees) drawn a second time as the sun sees it. The volumetric light reads it. Off by default.

enabled1
size4096texels per side, 256..4096. 4096 gives sharper sun shadows and costs about twice the GPU time of 2048. The Shadow Resolution control sets 1024, 2048 or 4096
range250yards covered either side of you
nearRange32a finer map this many yards either side of you, for the sun shadows. 0 = none. The Near Shadow Distance control sets it (16 to 128)
midRange100a middle map this many yards either side, for the sun shadows past the near map: the shade a wall's merlons or eaves cast close behind them. 0 = none (64 MB less)
depth700yards toward and away from the sun (far enough for a ridge to block it)
horizonDepth1500with mapTerrain: yards toward the sun the ground still casts, so a far ridge blocks the light. Buildings and models stay within depth
nearMargin16yards past the near map a model's reference point may be and still be drawn into it
terrainLeaves11 = hills and mountains cast part shade ([sunshadows] terrainShade), in a map of their own; 0 = full shade, in the solid maps
mapTerrain11 = the ground is read from the map files at full detail; 0 = only what the game draws
terrainLow11 = that ground casts from a copy never above the game's coarse far mesh, so the far ground does not shade itself in blocks; 0 = from the full detail
leafAlpha224the leaves from the map files cast where their texture's alpha is at least this (1..255)
leaves11 = leaves and bushes (alpha-tested) in shadow maps of their own, so they can let part of the sun through ([sunshadows] leafShade)
minTriangles200models with fewer triangles stay out of the far map past 60 yards (0 = all in)
farEvery2of those rebuilds, redraw the far map on every Nth (the near map on each), 1..8
midEvery2of those rebuilds, redraw the middle map on every Nth, on those the far map skips, 1..8
keepStill11 = the leaves' maps and the hills' map are not drawn again while nothing in them changes
mapEvery1rebuild the shadow map every N frames, 1..8 (3 = a third of the replay cost). The Shadow Redraw control sets it
horizon11 = distant terrain shades you too
snap11 = hold the far map on whole texels of its own grid: shadow edges do not crawl as you walk. 0 = it slides with you
nearSnap11 = hold the near map on whole texels of its own grid: shadow edges near you do not hop as you walk. 0 = it slides with you
sunStep0.05degrees: the maps' sun is held and moved on in steps of this, so the shadow edges do not crawl while you stand still. With a low sun each step moves long shadows a few pixels at once. 0 = it moves every frame
keepMargin100yards past range that a tree or building out of view keeps casting shade, from you across the ground: while it can still cast into the map
cacheTime0seconds at most that something out of view keeps casting shade; 0 = no limit
staleTime8with mapTerrain: seconds at most that something the game stopped drawing keeps its shade (characters, creatures, objects); 0 = no limit
evictDistance20yards: something in view this near that the game stopped drawing is gone
stillRadius0.3yards a tree may seem to move and keep its place in the map

[volume]

Volumetric light: the fog glowing where the sun reaches it and dark where leaves and walls shade it. The lamp-in-a-foggy-room look, fixed in the world as you move the camera. Needs [depth] and [shadow] enabled. Alt+F11 toggles it.

enabled1
strength25the dial, 0..100
maxIntensity3.0brightness at 100
density0.016how much the air scatters light, per yard. Higher = thicker, brighter shafts
smooth0.850..0.95: how much of the last frame's glow is kept. It moves with the camera, so a turn does not smear. 0 also stops the noise pattern from changing each frame
steps64samples along each line of sight (more holds up over a long maxDistance)
maxDistance190yards along each line of sight (keep at or under [shadow] range)
anisotropy0.0700 = glows the same from every side; toward 1 = mostly when looking toward the sun
bias0.5yards of slack in the shadow test, against speckle on sunlit surfaces
leafShade1how much of the sun the leaves stop in the air, 0..1. 1 = the light comes through the gaps between the leaves only, in shafts. The ground's own is [sunshadows] leafShade
color0xFFE6BERGB of the light (default: warm late-morning)
downscale2work at 1/N resolution per axis (2 = half)
blur1smooth the noise the step jitter leaves
quality31 low, 2 medium, 3 high. High uses the values above; medium and low replace steps and downscale with cheaper ones: medium 48, 2; low 32, 3
debug01 = show the glow alone, white, to see its shape. For finding faults, one stage of the march each: 2 = white if it runs at all, 3 = the depth it reads, 4 = distance marched (white = maxDistance), 5 = share of each ray in sunlight
occlusion11 = the light fades when the sun's disc is behind terrain on screen, as for the rays ([rays] occlusionRadius and occlusionFull). The shadow map reaches only [shadow] depth, so without this a sun setting behind the far horizon lights the fog

[sunshadows]

Sun shadows: trees, buildings and characters shade the ground and walls. They come from the volumetric light's shadow map, so they draw only while [volume] draws. They follow the sun's height and [night] strength. Within [shadow] nearRange yards of you they use a finer map (0.016 yards a texel at size 4096), further out the far one (0.12). F12 logs the draw (lines starting "sunshadows:").

enabled1
world1terrain, buildings, trees and doodads cast. 0 = only players and creatures do, and the ground keeps the game's own baked shadows
units1players and creatures cast. 0 = the game's round shadow under them instead
lock01 = shadows at a set tilt all day, as the game's own baked shadows are; 0 = follow the sun
lockTilt15with lock: degrees from straight down (0 = the sun overhead, short shadows)
lodBias2yards of slack in the shadow test for every 100 yards past lodStart: the game draws distant ground coarser, and without it soft blobs lie on far slopes. 0 = none
lodStart80yards from the camera where lodBias starts
indoor00..1, how much of the sun shadows is kept inside a building (the game lights rooms itself)
shadeColor0x7C94C8RGB shade leans toward: the sky's cool light (its hue only: brightness is kept)
shadeTint0.650..1, how much. 0 = shade only darkens, in grey
sunColor0xFFE4C0RGB sunlit ground leans toward: warm
sunTint0.950..1, how much
strength20the dial, 0..100: how much of the light a shaded surface loses
night1000..100: the shadows at night, as % of strength. [night] strength does not apply
riseFrom12degrees: with the sun or moon lower than this, the shadows' light climbs back up as it sinks. A low light pushes shadows away from what casts them. 0 = never
riseTo85degrees: the shadows' light with the sun or moon at the horizon or under it
unitStrength450..100: players' and creatures' shadows this much darker again, also inside the shade of a building. 0 = as dark as the world's
unitGap0.5yards along the sun over which that extra fades in from the unit, on its own body only: less on its back and arms, and the ground keeps it up to the feet
unitDrop4yards under the unit past which that extra fades out, over 3 more: a shadow on the ground lies within the unit's height, the water under a bridge lower
bodyShade300..100: the shade on a player's or creature's own body, as a share. 100 = all of it, 0 = none. The Character Backside Shadow control sets it
bias3texels of slack in the depth test at the least; more as the sun gets lower, so flat ground does not shade itself in stripes. In texels of each map. Higher = no bands where a surface shades itself, but shadows start further from what casts them
minGap0yards: a blocker nearer the surface than this, along the sun, does not shade it. Against a model or a tree shading itself; shadows then start this far from where something touches the ground
sunOffset0.06yards each point is moved toward the sun before the test, against the same
normalBias4texels of the finest map each point is moved along its facing, rebuilt from the depth, where the sun grazes the surface or is behind it. 0 = none, and walls the sun grazes shade themselves in stripes; 2 left speckles where it grazes a round tower. Players and creatures take none of it (the facing is per triangle on a model); with units = 0 they take all of it
foliageSlack1.5yards: foliage (the ground's grass and ferns, the game's clutter) takes no shade from leaves nearer the sun than this, its own or a neighbour's, so a fern does not stripe itself; a canopy higher up still shades it
foliageRadius1.9yards: foliage takes the shade as the share of a disc this wide round it that sees the sun, so a plant is all dark under cover and as drawn in the open, not dappled or cut in two by a shadow's edge. 0 = the shade as it falls
foliageEdge0.350..0.5: how far either side of half lit that share turns from dark to lit
foliageUnits00..1: how much of the creatures' shadows falls on the ground's grass and ferns
slope00..1, how much of the surface's slope (from the same facing) sets each tap's depth. Try 1 if sloped ground shows stripes at a high softness
softness1.0how far apart the taps of the soft edge are, in map texels. 0 = sharp edges
fetch411 = each tap reads its four texels in one (Fetch4), where the game's d3d9.dll gives them; 0 = four reads. At softness 1 the taps are read as one 4x4 block. The look is the same
baked00..1, how much of the terrain's own baked shadow is kept while these draw. It points one way at every hour; it is back in full as these fade at dusk
leafShade0.60..1, the share of the sun that leaves stop (the Tree Shadow Strength control). A tree's shade shows inside a hill's, darker. Solid things under them still shade
terrainShade0.60..1, the share of the sun that hills and mountains stop, with [shadow] terrainLeaves
terrainBias1.5yards: the least slack in the hills' depth test. Less, and the ground shades itself in faint bands; more, and a small hill's shade starts further from it
hillCarry30yards: inside a hill's shade, a tree's or a wall's shade is kept in full this far from what it falls on, and gone at twice as far. 0 = no limit
water0.40..1: the shade on the water's own surface, as a share of the ground's, soft edged (Shadow on Water). The bed under the water keeps its own
sunlight0.350..0.5, what the sun reaches is brightened by up to this share (0.2 = 20%)
debug01 = show the shade alone (white = lit); 2 = the leaves' shade alone

[lamps]

Lamps, lanterns and torches: the fog glows around them, and lampposts light the ground and walls near them as the game's torches do. The lights are the game's own (torches and braziers, also those NPCs carry) and lampposts, found by their glow sprite. It uses the volumetric light's depth and camera, so it draws only while [volume] draws, but it does not follow the sun and draws at night too. F12 logs the lights it draws (lines starting "lampglow:").

enabled1
strength26the dial, 0..100
maxIntensity10.0the glow in the air: brightness at 100
surface7a lamppost's light on the ground and walls near it, like a torch's: brightness at 100. 0 = none. The game's own torches light these already and are left alone
torchLight0.23fires (torches, braziers, campfires, and the torches NPCs carry): their glow and light, 0..2. The game lights models near them already, so at 1 those are lit twice
lanternLight0.69lamps (lampposts, lanterns, candles, chandeliers): their glow and light, 0..2
indoors0.29every lamp while you are inside a building, 0..1. A room holds many lights close together, and at 1 the air between them washes out
density0.03how much the air scatters a lamp's light, per yard. Higher = a wider, brighter glow
day51% of the night strength by day, by [night] dusk, dawn and fade
maxDistance120yards: a light further away adds nothing. The glow also fades over the far half of the fog
maxLights32the most lights one part of the screen draws, nearest first, 1..32
keep2seconds a light on screen may go unseen before it fades out. A light off screen is kept: the game names a lamppost only while it is on screen
softness0.4yards: the radius of a light's bright core
through1.5yards the glow runs on past the first surface in the way. The game's light sits inside the torch head or the bowl, which hides it from some angles at 0. A lamp this near behind a wall glows faintly through it
sprites11 = lampposts glow too, found by their warm glow sprite
files11 = the candles, torches and fireplaces in buildings glow too, read from the map files
fogReach2.6how far into the fog lamps still glow: 1 = they fade over the far half of the fog, as the game fades its own lamp sprites; 2 = twice as far
spriteReach16yards a lamppost's light reaches (a torch's is 17; the game's lights carry their own)
spriteGain1.5a lamppost's brightness; 1.5 is about a torch's
debug01 = show the glow alone, over black; 2 = the distance it reads (white = 50 yd); 3 = the light on surfaces alone

[rays]

Sun rays: bright sky near the sun streaks outward, through gaps in the trees and clouds. Drawn after the world and before the UI, so the UI gets none. Cheap, and needs neither [depth] nor [shadow]. The rays follow the sun in [sun]. Ctrl+F11 toggles them.

enabled1
strength40
maxExposure5.7
relThreshold0.200..1, a pixel casts rays if it is this bright relative to the brightest thing on screen, so sky gaps in a dim forest still cast. Lower = more things glow
threshold0.200..1, absolute minimum brightness, so dark scenes do not streak from dim lights
radius0.8how far from the sun, in screen heights, pixels still cast rays. Keep this tight: wider lets bright clouds elsewhere in the sky cast rays too
falloff2.0how sharply that fades with distance: 1 = straight line, 2+ = hugs the sun
length0.850..1, ray length as a fraction of the way from each pixel toward the sun
maxLength0.6...but never longer than this many screen heights (matters when the sun is far off screen)
maxAngle60degrees between where you look and the sun at which rays are gone. Over 90, rays stream in from the top of the screen with the sun out of view, fed by whatever sky is there, so the view brightened and darkened as the camera tilted. The shafts from a sun out of view come from the volumetric light instead
viewFalloff1.0how quickly rays weaken as you turn from the sun toward maxAngle; higher = faster
parallel0.00 = rays fan out from the sun (how real sunbeams look in perspective); 1 = parallel streaks all falling the same way: a stylised look, not steadier
adaptTime0.5seconds for "what counts as bright" to follow the scene; 0 = instant (flickers)
coverTime0.15seconds the rays and the volumetric light take to fade when something covers the sun, and to come back when it is clear
decay0.960.5..1, falloff along each ray; lower = shorter, softer shafts
soften1pixels (of the mask, which is 1/downscale of the screen) the mask is blurred before the rays are drawn, so small gaps between leaves do not make rays jump. 0 = none
smooth00..0.95, how much of the last frame is kept, moved with the sun. Leaf edges smaller than a pixel flicker as the camera moves; this keeps the rays steady. 0 = none
color0xFFE6BERGB of the light (default: warm late-morning)
passes31..3 blur passes; fewer is cheaper but shows banding
downscale2work at 1/N resolution per axis
debugView01 = show only the bright-pixel mask, 2 = show only the rays, 3 = show the sky kept before the clouds (for skyOnly). For tuning
placement00 = between world and UI; 1 = over everything, UI included (fallback)
mask11 = a pixel casts where it shows sky, from the depth buffer: steady as the camera moves. 0 = by brightness, relative to the brightest thing on screen (relThreshold)
skyOnly11 = only the sky casts, not the clouds: lit clouds near the sun glow otherwise. The kept sky has no glow, so it is dimmer; relThreshold 0.20 suits it. 0 = all
secondMoon1at night the volumetric light follows the larger of the two moons. 1 = the other moon casts rays too; 0 = rays from the larger moon only
occlusion11 = rays fade when the sun itself is covered, by a mountain or a wall. Tested by depth when [depth] is on, else by brightness (needs skyOnly; heavy fog defeats it). 0 = the sky above a ridge casts rays over it with the sun behind it
occlusionRadius0.08screen heights around the sun that are tested
occlusionFull0.35share of that sky in view that gives full rays; less fades them. Lower keeps more rays through a canopy

[night]

Sun rays and volumetric light at night. At night they follow the moons, which are high in the sky, so without this the rays and the light at night are as strong as by day. Night is told from the game clock ([client] clockAddr), so it follows the time [time] sets. F12 logs the game time and the value in use.

strength25the dial, 0..100: the rays and the light at night, as % of their day strength. 100 = as by day, 0 = none at night
dusk20hour the change to night starts (fractions allowed: 20.5 = 20:30)
dawn5hour the change to day starts
fade1.5hours each change takes: full night from dusk + fade to dawn, full day from dawn + fade to dusk
darkness0.200..0.9: how much darker the world is at full night (Night Darkness). Lamps still light the ground near them. Needs Volumetric Light on
tint0.650..1: how far the night leans toward moonColor (Moonlight Colour)
moonColor0x9CB8FFRGB of the moonlight (its hue only: brightness is kept)
sky0.50..1: the share of the darkness the sky gets. 0 leaves the sky, moons and stars
rain0.30..0.9: how much darker again while it rains at night, the sky too (Rain Darkness)
indoors01 = darker inside buildings too

[lighthouse]

Lighthouses at night: a beacon in the lamp room and two beams turning round, for every building whose file name holds LIGHTHOUSE. The game's own lighthouse light does not work with HD models.

enabled10 = none (Lighthouses)
beacon20..3: how bright the beacon is
beam0.120..1: how bright the beams are (Lighthouse Beam)
hideGameLight11 = leave out the game's own lighthouse light (ours takes its place)
beaconSize2.5yards: the beacon's radius (never less than about a fifth of a degree on screen)
beamWidth0.5yards: the beam's half width at the lamp
beamSpread0.035yards it widens a yard out: 0.035 is about 2 degrees each side
beamLength400yards each beam reaches
reach60050..1500 yards: a lighthouse further off is not drawn (Lighthouse Distance)
beamSpeed12seconds the beams take to go round
beamTilt-0.03the beam's slope: below 0 it points a little down
beamCount11 beam, or 2 opposite
surface1.50..10: its light on the surfaces round it (the tower, the rocks), times beacon
surfaceReach25yards that light reaches
glint20..3: its glitter on the water, times beacon (Lighthouse Glint)
faceStrength1.60..4: the wave faces the beam lights on the water (Wave Face Strength)
faceTilt0.050..0.3: the tilt toward the lighthouse a wave face starts to catch it (Wave Face Tilt)
faceSoft0.080.005..0.3: how gradual the edge between lit and dark faces is (Wave Face Softness)
waterWidth1.50.25..4: the patch of water the beam lights, times the beam's width (Beam Width on Water)
lampShiftX2.38yards across from that origin, x and y (the owner's, in Stormwind's harbour)
lampShiftY0.97
lampRise20yards over the game's own light's origin (LIGHTHOUSEEFFECT) the lamp is
day10..1: its strength by day, as a share of the night's (0: at night only)
lampDrop9yards under the tower's tip the lamp is, where the tower is one group (Stormwind's harbour)
color0xFFE2A8RGB of the light

[colour]

Colour saturation of the world, one value by day and one at night. The change between the two follows the game clock by [night] dusk, dawn and fade. The UI keeps its colour. With both at 100 nothing is drawn.

enabled10 = off: no pass and no clock read (Color Effects)
day1000..200: the saturation by day, in %. 100 = the game's own, 0 = grey (Day Saturation)
night1000..200: the saturation at full night (Night Saturation)

[grass]

The grass in the wind (comfygrass until 2026-10-06). The client's grass draws through a vertex shader of ours: two waves sway each blade from its root, and the blades lean away from your character. Remove comfygrass.dll from dlls.txt: while it is loaded, its grass is drawn and this section does nothing.

enabled10 = the game's still grass (Grass)
scale2.00..5: the wind's strength. The parting does not follow it (Grass Wind)
directionDeg45the wind's heading, degrees (Grass Wind Direction)
speed3.0yards a second the waves travel (Grass Wave Speed)
wavelength18yards from one wave to the next. Above 33 hides the seam between chunks (Grass Wave Length)
amplitude0.060yards the first wave sways a blade's tip
crossAmplitude0.020yards the second wave, across the first, sways the tip
crossWavelength6.5yards
crossAngleDeg35degrees between the two waves
lean0.35a constant lean down the wind, as a share of the first wave (Grass Lean)
variance0.60..1: how much the sway differs from blade to blade
anchor0.70the share of a blade from its base that does not move, used only without models
worldPhase01 = the wave runs on across chunks, but slides as the camera moves
parting10 = the blades do not lean away from your character
radius2.0yards round your character the blades part (Grass Parting Radius)
forceCenter0.5the lean at your character (Grass Parting)
forceEdge0.0the lean at the radius
centerZ0.0yards the parting's centre is moved up from your feet
zRange4.0grass more than this many yards above or below you does not part
zFade2.0yards over which it fades out at that limit
models10 = no patch: rocks move, and anchor sets the bend
rigidHeight0.3yards: a model lower than this does not move
rigidNamesRoc,Bona model whose file name holds one of these words does not move
fillAddr0x006B26CDthe instruction in WoW.exe that picks each instance's vertex colour
stride36
minVerts64leaves out about 65 small draws of ordinary doodads in the same format
maxVerts00 = no limit
primType4D3DPT_TRIANGLELIST
debug01 = the bend as a colour (Debug View 30)

[time]

The time of day, on your screen only (comfytime until 2026-10-07). Ctrl+PageUp / Ctrl+PageDown move the time by step hours, later / earlier; hold to keep moving. Ctrl+End switches between dayHour and nightHour. The debug panel has a slider and Lock time, which sets enabled. While the time is locked, an hour you move is written into hour below a second later, so the next start shows the same sun. It writes the time into the client's memory; the server keeps its own. The addresses below were found for one WoW.exe by the Ctrl+F12 search (it logs to comfyatmos.log); another build moves them, and the time is not written if they do not hold a time. Remove comfytime.dll from dlls.txt: while it is loaded, it sets the time and this section does nothing.

enabled10 = leave the game's own time alone (Lock time in the debug panel)
hour8.75950..24, fractions allowed (13.5 = 13:30)
step0.0833hours per Ctrl+PageUp / PageDown (0.0167 = about a minute)
dayHour13Ctrl+End switches between this hour and nightHour
nightHour10..24, fractions allowed, as for hour
addrMinutes0x00CE9B60
addrFraction0x00CE9B64
addrMinutesF0x00CE8574
localTime0

[bench]

The benchmark. Alt+F12 runs four steps: rays + volumetric light + fog, rays + the fog alone, rays, nothing. Each step runs for settle seconds, then is measured for measure seconds. Then the settings go back as they were, and a table goes to comfyatmos.log: frame rate, the slowest 1% of frames, and the GPU and CPU time of our own passes, with the light split into its parts. Play with the light on for a minute first, so its cache is full. Stand still, do not move the mouse, and face the sun. F11 stops it.

settle5seconds before each step is measured (shaders compile, the shadow cache fills)
measure5seconds each step is measured

[sky]

clouds11 = our clouds ([clouds]) in place of the game's cloud layer; 0 = no clouds (Clouds)
gameClouds01 = the game's own cloud layer instead of ours, to compare
hideRainStreaks01 = leave out the game's rain streaks, for debugging the weather
hideRainClouds01 = leave out the game's grey puffs drawn over everything in rain
hideTexture00x and a probe's tex0: leave out the game's draws with that texture, for debugging
hideRainMist11 = leave out the grey mist the game draws a few seconds into a shower (it reads as smoke)

[clouds]

Our clouds: one soft layer that drifts with the wind, and in it now and then a cloud with a shape. The shapes are the pictures in Interface\AddOns\ComfyAtmosphere\clouds (dark on light, drawn from the side, facing right). Every player at one place sees the same sky: the real clock places the clouds, not the game's time.

cover0.450..1: how much of the sky the clouds cover; rain raises it (Cloud Cover)
softness0.450.05..1: how soft the edges are (Cloud Softness)
shapesOn11 = the shaped clouds; 0 = none (the Cloud Shapes box)
shapes150..100: how many shaped clouds come over on the wind: at 100 about 8 are in the sky at once (Cloud Shapes)
erode0.350..1: how much the billows change a shape's outline. More: harder to see (Cloud Shape Billows)
clearing0.750..1: how much the clouds are cleared round a shape, so it stands on its own (Cloud Shape Cutout)
cutoutWidth0.50..1: how far that clear gap reaches out from the shape's outline (Cloud Shape Cutout Width)
layerHeight2600yards over the camera: the clouds
layerSoftness0.60..1: the clouds in big soft masses, without their fine broken billows (Cloud Layer Softness, as a percentage); 0 = as torn and fine as before 2026-10-10
scale2600yards: the size of the largest billows (Cloud Scale)
puffiness0.750..1: cumulus, round puffs; 0 = smooth sheets and streaks (Cloud Puffiness)
reshape0.150..1: how much the clouds change shape as they drift; 0 = they keep it (Cloud Reshaping)
windSpeed15yards a second (Cloud Speed)
transitionTime12seconds the clouds take to change between clear and rain, both ways (Cloud Transition Time)
windDeg60degrees: where the wind blows to, 0 = north, 90 = west
shapeSize1400yards: half the width of a shaped cloud (Cloud Shape Size, which shows the whole width)
brightness1the lit side's brightness
opacity0.800..1: how much of the sky the thickest cloud hides
shadeSky0.350..1: how much sky colour shows through the shaded side
horizon0.10the sine of the angle over the horizon at which the clouds are full
haze30000yards at which the clouds fade into the horizon's colour
testShape-10 and up: that shape (in name order), formed, ahead of the camera. For screenshots
debug01 = the shapes red, the clouds blue; 2 = the whole sky flat white, to see what is drawn over it

[water]

Foam where the water is shallow: at the shore, and round anything that stands in the water.

enabled1
foam0.250..1: how white the foam is (Foam)
foamWidth1yards of depth: the foam thins out to nothing at this depth
edgeLine0.10..1: the thin light line where the water meets the sand (Edge Line)
edgeWidth0.1yards along the ground the edge line spans (Edge Line Width)
shoreFoam0.850..1: the game's own foam texture near the shore (WATERFOAMLOOP2.blp)
shoreFoamSize5yards one copy of that texture spans
foamReach4yards out from the waterline: the same across the water, for a gentle beach
foamScale0.6yards: the size of a bubble in the foam
foamSpeed1how fast the foam moves and the bands roll in to the shore
ripples0.40..1: the rings round anyone standing in the water
rippleDepth10..4: how deep the rings' waves look round anyone standing still, their foam line left as it is (Standing Ripple Depth)
rippleDepthMoving3.40..4: the same for the rings of anyone walking or swimming (Moving Ripple Depth)
rippleSpread0.50.1..3: how fast the rings round anyone standing still grow, so how large they get; 1 is 1.1 yards a second (Standing Ripple Spread)
rippleSpreadMoving10.1..3: the same for the rings of anyone walking or swimming (Moving Ripple Spread)
wetSand0.450..1: how much darker the sand is where the water reaches (Wet Sand)
surface10..1: how much of our water is drawn over the game's (0 = the game's water alone)
clarity0.5how clear the water is: 2 = you see twice as deep
zone11: deep water takes the game's own water colour for the zone and the hour, warmed by the sky at dusk, in place of colour; 0: colour (Zone Colour)
sunset10..3: how far the water turns to the sky's glow at sunset, by how red the glow is, and how much more of the sky it shows; 0 none (Sunset Water, as a percentage)
colour250..100: the colour deep water turns with zone 0: 0 green, 50 teal, 100 blue (Water Colour)
reflection0.150..1: how much of the sky the water shows at a glancing look (Sky Reflection)
skyFromGame11: the water reflects the game's own sky for the zone and the hour; 0: skyColor
skyColor0x5A9AD8RGB of the sky high up as the water reflects it, with skyFromGame 0 or until the game's sky is read; the horizon is the game's fog colour
brightness0.70.25..2: the water's own colour, lighter or darker (Water Brightness)
glint10..3: the sun's glint on the waves (Sun Glint)
moonGlint0.60..3: the moons' glint on the waves by night (Moon Glint)
glintSize10.25..4: how wide the glint spreads: 2 = twice as wide (Glint Size)
waves10..3: how choppy the small waves are
waveHeight1yards: how tall the swell rises, out where the water is 6.5 yards deep or more
waveScale2the size of the waves: 2 = twice as long
whitecaps0.30..1: foam on the waves out in deep water (Open Water Foam Amount)
foamDrawn11 = the drawn foam; 0 = the game's texture (Drawn Foam)
foamCell0.9yards: the size of its blobs (Foam Size)
foamLife1.5yards out from the water's moving edge the foam lasts (Foam Reach)
wakeFoam0.250..1: the drawn foam's splash at a body moving through the water (Wake Foam)
shipWake00 off, 2..20: a ship's wake, a body's this many times the size (Ship Wake); 10 is a good size
shipWakeForward150..60 yards: how far ahead of the hull's origin the wake starts (Ship Wake Forward)
shipWakeDepth20..6: the ship's wake's waves, times a body's (Ship Wake Depth)
lakeSwash00..1: the share of the sea's swash and shore waves a lake, a pond or a river gets (the map tells the sea from the rest) (Lake Swash)
lakeFoam0.30..1: the share of the sea's shore foam it gets (Lake Foam)
lakeWaves00..1: the share of the sea's swell (waveHeight) it gets (Lake Waves)
rain10..2: the rain's rings on the water while the game rains (Rain on Water); 0 none
objectFoam0.60..1: the drawn foam round objects standing in the water: posts, rocks, piers (Object Foam)
objectFoamWidth0.8yards out from an object the foam reaches (Object Foam Width)
foamEdge0.60..0.9: the foam's cut at the water's edge: higher leaves more holes in the youngest foam
openFoam11 = foam on the swell's crests out in deep water, at whitecaps (Open Water Foam)
swash0.6above 0: the water runs up the beach and back (Swash, on or off)
swashHeight0.05yards of height the swash climbs at most; up a gentle beach 5 times that along the ground (Swash Height)
swashLength90yards along the shore one surge spans: lower, more and shorter surges (Swash Length)
swashSpeed0.3how fast the surges come: 1 is one every 11.4 seconds (Swash Speed)
wake0.850..1: the wake behind anyone moving through the water (Wake)
cover0.50..1: how much the water covers a character standing in it (Underwater Cover)
refraction0.125yards: how far the waves bend what lies under the water (Underwater Distortion)
gameWake01 = the game's own wake and splash round anyone in the water; 0 = hidden, the ripples take their place
foamColor0xEEF4F6RGB of the foam by day; the night darkens it
fadeEnd150yards: the foam fades out over the last 40% of this distance
debug01 = the depth under the water (blue shallow, red at 4 x foamWidth); 2 = the foam alone; 3 = the wet sand alone; 4 = what lies under it; 5 = the ripples and the wake (Debug View 16 to 20)
debugSkip0for measuring what each draw costs, added up: 1 leaves out the sand part, 2 the water part, 4 the bodies' draw, 8 the surface's depth over them. Keep it 0

[general]

enabled10 = every effect off at once, the game as stock (the Atmosphere Effects box)
trace01 = F12 also traces 180 frames of the volumetric light (slow: reads the GPU), and the log gets frame rate and light statistics every 300 frames
log1
hook10 = load but patch nothing, for bisecting problems
sliders10 = do not register the CVars that the addon's controls set
hotkeys01 = the keys in this file work (F11, F12, Ctrl+PageUp and the rest). They are read past the game's key bindings, so they are off for players. The debug panel's Developer keys box sets it. Key Bindings > ComfyAtmosphere has every action
reloadKey122VK_F11
probeKey123VK_F12; with Alt, the benchmark
scanKey123VK_F12, with Ctrl: search memory for the game clock (read-only, about 6 minutes)
dayNightKey35VK_END, with Ctrl: switch between [time] dayHour and nightHour
chainWaitMs10000wait this long for an old comfygrass.dll to patch first
minWorldDraws16world draws needed before the switch to 2D counts as the end of the world

Test settings: frame-rate-performance

The Atmosphere page controls this test applies at the start of every run, so results compare across runs. Captured from a reference setup on 2026-10-06. Values are shown as on the in-game sliders. Settings without a slider use the defaults in comfyatmos.ini.

Sun fixed at azimuth 45 and elevation 45 degrees, the same light every run.

Light

Volumetric Light1comfyVolume
Volumetric Light Strength25comfyVolumeStrength
Volumetric Light Quality3comfyVolumeQuality
Light Density16comfyVolumeDensity
Light Distance190comfyVolumeDistance
Light Toward the Sun70comfyVolumeDirection

Fog

Fog1comfyMist
Fog Density25comfyMistDensity
Fog Height25comfyMistHeight
Fog Brightness120comfyMistBrightness
Fog Sunlight40comfyMistSun
Fog Patchiness50comfyMistPatches
Wind Speed15comfyMistWind
Wind Direction45comfyMistWindDir
Fog Reach200comfyMistReach
Fog on Sky75comfyMistSky
Low Ground Mist150comfyMistLow
Water Mist210comfyMistWater
Morning Mist100comfyMistMorning
Lamps in Mist50comfyMistLamps

Lamps

Lamp Glow26comfyLampGlow
Lamp Distance260comfyLampDistance
Lamps1comfyLamps
Torch Light23comfyTorchLight
Lantern Light69comfyLanternLight
Indoor Lamps29comfyIndoorLamps
Lamps by Day51comfyLampsDay
Lighthouses1comfyLighthouses
Lighthouse Beam80comfyLighthouseBeam
Lighthouse Beacon200comfyLighthouseBeacon
Beam Length425comfyLighthouseLength
Beam Width8comfyLighthouseWidth
Beam Spread75comfyLighthouseSpread
Beam Speed20comfyLighthouseSpeed
Two Beams0comfyLighthouseTwoBeams
Lighthouse Glint200comfyLighthouseGlint
Wave Face Strength110comfyLighthouseFace
Wave Face Tilt90comfyLighthouseFaceTilt
Wave Face Softness100comfyLighthouseFaceSoft
Beam Width on Water185comfyLighthouseWaterWidth

Shadows

Shadow Resolution3comfyShadowResolution
Shadow Softness1comfyShadowSoftness
Shadow Redraw1comfyShadowEvery
Sun Shadows1comfySunShadows
Sun Shadow Strength20comfySunShadowStrength
Sunlight35comfySunlight
World / Object Shadows1comfySunShadowsWorld
Player / Creature Shadows1comfySunShadowsUnits
Lock Shadow Angle0comfyShadowLock
Shadow Angle15comfyShadowTilt
Shade Colour65comfyShadeTint
Sunlight Warmth60comfySunTint
Night Shadows100comfySunShadowsNight
Character Shadow Strength45comfySunShadowsUnitStrength
Sun Smoothing3comfySunGlide
Character Backside Shadow30comfySunShadowsBody
Near Shadow Distance32comfyShadowNear
Tree Shadow Strength60comfyTreeShade

Sky

Sun Rays1comfyRays
Sun Rays Strength40comfyRaysStrength
Night Strength25comfyNightStrength
Sun Rays Softness1comfyRaysSoften
Sun Rays Smoothing0comfyRaysSmooth
Night Darkness40comfyNightDarkness
Moonlight Colour65comfyMoonlight
Rain Darkness20comfyRainDarkness

Clouds

Clouds0comfyClouds

Color

Day Saturation100comfyDaySaturation
Night Saturation75comfyNightSaturation
Color Effects1comfyColor

Water

Wave Height0comfyWaveHeight
Wave Size50comfyWaveSize
Water Effects1comfyWater
Water Colour10comfyWaterColour
Water Clarity400comfyWaterClarity
Sky Reflection15comfyWaterReflect
Underwater Distortion0comfyWaterBend
Underwater Cover75comfyWaterCover
Wake80comfyWaterWake
Foam35comfyWaterFoam
Swash1comfyWaterSwash
Sun Glint100comfyWaterGlint
Moon Glint60comfyWaterMoonGlint
Glint Size100comfyWaterGlintSize
Edge Line10comfyWaterEdge
Edge Line Width1comfyWaterEdgeWidth
Water Brightness70comfyWaterBright
Standing Ripple Depth100comfyWaterRippleDepth
Swash Height100comfyWaterSwashHeight
Swash Length50comfyWaterSwashLength
Swash Speed30comfyWaterSwashSpeed
Moving Ripple Depth340comfyWaterRippleMoving
Standing Ripple Spread50comfyWaterRippleSpread
Moving Ripple Spread70comfyWaterRippleSpreadMoving
Drawn Foam1comfyWaterFoamDrawn
Foam Size3comfyWaterFoamSize
Foam Reach25comfyWaterFoamReach
Open Water Foam0comfyWaterOpenFoam
Open Water Foam Amount0comfyWaterOpenFoamAmount
Foam Breakup0comfyWaterFoamEdge
Wake Foam0comfyWaterWakeFoam
Object Foam60comfyWaterObjectFoam
Object Foam Width8comfyWaterObjectFoamWidth
Lake Swash75comfyWaterLakeSwash
Lake Foam15comfyWaterLakeFoam
Lake Waves0comfyWaterLakeWaves
Rain on Water80comfyWaterRain
Ship Wake0comfyWaterShipWake
Ship Wake Forward0comfyWaterShipForward
Ship Wake Depth0comfyWaterShipDepth

Other

Atmosphere Effects1comfyAtmosphere

Signing in

last run 2026-10-14 15:13
No freeze
Largest stutter0.91 s limit 1.5 s
Slow frames after it9 over 40 ms, limit 12
Compiling in the game4 ms limit 100 ms; 11,091 ms before the shader cache
Effects on after15.8 s after the world first appears
Shader worker17 ms until every shader is ready
Largest stutter at sign-in (s)
01.42.74.1limit 1.5 sOct 6 12:08Oct 14 15:13
Largest stutter 0.9 s

Frame rate

last run 2026-10-14 15:09

Measured for 10 s at each place fps with effects fps the effects take

Harbour
132 fps
Without effects211 fps
Effects cost2.9 ms
Frame time7.6 ms game 4.7
Stutter11.5 ms limit 40
Elwynn
95 fps
Without effects133 fps
Effects cost3.0 ms
Frame time10.5 ms game 7.5
Stutter15.6 ms limit 40
Ironforge
171 fps
Without effects299 fps
Effects cost2.5 ms
Frame time5.8 ms game 3.3
Stutter11.2 ms limit 40
Frames per second
3392151211limit 50 fpsOct 6 12:06Oct 14 15:09
Harbour 132 fpsElwynn 95 fpsIronforge 171 fps
Effects cost (ms a frame)
035.98.9Oct 6 12:06Oct 14 15:09
Harbour 2.9 msElwynn 3 msIronforge 2.5 ms
Stutter, slowest 1% (ms)
5183144limit 40 msOct 6 12:06Oct 14 15:09
Harbour 12 msElwynn 16 msIronforge 11 ms
All numbers

frame-rate-performance

Harbour fps
131.8 fps
limit at least 50 fps
Harbour slowest 1%
11.5 ms
limit at most 40 ms
Harbour our CPU
1 ms
recorded only
Elwynn fps
95.1 fps
limit at least 50 fps
Elwynn slowest 1%
15.6 ms
limit at most 40 ms
Elwynn our CPU
1.9 ms
recorded only
Ironforge fps
171.4 fps
limit at least 50 fps
Ironforge slowest 1%
11.2 ms
limit at most 40 ms
Ironforge our CPU
1.7 ms
recorded only
Harbour fps without effects
211.3 fps
recorded only
Elwynn fps without effects
132.7 fps
recorded only
Ironforge fps without effects
298.6 fps
recorded only

load-performance

Compiling on the game's thread
4 ms
limit at most 100 ms
Worst frame as the effects start
905 ms
limit at most 1500 ms
Slow frames as the effects start
9
limit at most 12
Effects start after the world
15.8 s
recorded only
Shader worker
17 ms
recorded only

moo-canyon-water-performance

moo canyon water-on
168.5
limit at least 1
moo canyon water-off
177.9
limit at least 1

auberdine-water-performance

auberdine standing-water-on
158.1
limit at least 1
auberdine turning-water-on
112.1
limit at least 1
auberdine turning-water-off
140
limit at least 1

volume-cost PASS last run 2026-10-14 15:32

Measures what the Volumetric Light box costs, 10 seconds each, at Stormwind's harbour and on Elwynn's ridges: light on, off, on, off, on, so a drift in the GPU's speed shows. Every other control as frame-rate-performance sets it. The frame log gives each pass's GPU and CPU time. The game window must be in front.

  • Harbour, light on (1 of 5), frames a second108.6 (at least 1)
  • Harbour, light off (2 of 5), frames a second137.9 (at least 1)
  • Harbour, light on (3 of 5), frames a second114 (at least 1)
  • Harbour, light off (4 of 5), frames a second128.4 (at least 1)
  • Harbour, light on (5 of 5), frames a second119.1 (at least 1)
  • Elwynn, light on (1 of 5), frames a second95.3 (at least 1)
  • Elwynn, light off (2 of 5), frames a second111.7 (at least 1)
  • Elwynn, light on (3 of 5), frames a second93.4 (at least 1)
  • Elwynn, light off (4 of 5), frames a second111.8 (at least 1)
  • Elwynn, light on (5 of 5), frames a second93.3 (at least 1)

No screenshot taken.

Positions and messages
Where the character was:
  arrive -8625.00 1328.90 5.60 in 1.0 s
  heading 36.90
  heading 36.90
  pitch -12.40
  arrive -9416.70 -2248.00 67.80 in 1.0 s
  heading 53.00
  heading 53.00
  pitch 11.70

volume-parts PASS last run 2026-10-14 15:35

Measures what each part of the volumetric light costs, 10 seconds each, on Elwynn's ridges and at Stormwind's harbour, with every effect on between the others ([shadow] debugSkip): without the sun shadows' pass, the march's reads of the maps, drawing the maps, the cache's upkeep, and the light. The game window must be in front.

  • Elwynn, all on93.2 (at least 1)
  • Elwynn, skip sun shadows pass93.7 (at least 1)
  • Elwynn, all on95 (at least 1)
  • Elwynn, skip march map reads93.8 (at least 1)
  • Elwynn, all on94.9 (at least 1)
  • Elwynn, skip drawing the maps99.5 (at least 1)
  • Elwynn, all on91.8 (at least 1)
  • Elwynn, skip the cache upkeep104.3 (at least 1)
  • Elwynn, all on94 (at least 1)
  • Elwynn, light off111.8 (at least 1)
  • Elwynn, all on92.1 (at least 1)
  • Harbour, all on116.9 (at least 1)
  • Harbour, skip sun shadows pass119.6 (at least 1)
  • Harbour, all on115.6 (at least 1)
  • Harbour, skip march map reads116 (at least 1)
  • Harbour, all on112.3 (at least 1)
  • Harbour, skip drawing the maps122 (at least 1)
  • Harbour, all on112.1 (at least 1)
  • Harbour, skip the cache upkeep119.6 (at least 1)
  • Harbour, all on104.5 (at least 1)
  • Harbour, light off137.3 (at least 1)
  • Harbour, all on118.4 (at least 1)

No screenshot taken.

Positions and messages
Where the character was:
  arrive -9416.70 -2248.00 67.80 in 1.0 s
  heading 53.00
  arrive -9416.70 -2248.00 67.80 in 1.0 s
  heading 53.00
  heading 53.00
  pitch 11.70
  arrive -8625.00 1328.90 5.60 in 1.0 s
  heading 36.90
  heading 36.90
  pitch -12.40

water-cost PASS last run 2026-10-14 15:42

Measures what the water's draws cost at Stormwind's harbour, 10 seconds each, with every effect on between the others so a drift in the GPU's speed shows: without the sand part, the water part, the bodies' draw, all three ([water] debugSkip), and the water. The frame log gives each one's GPU and CPU time. The game window must be in front.

  • all on, frames a second117.8 (at least 1)
  • no sand part, frames a second119 (at least 1)
  • all on, frames a second117.3 (at least 1)
  • no water part, frames a second119.5 (at least 1)
  • all on, frames a second115 (at least 1)
  • no bodies' draw, frames a second119.6 (at least 1)
  • all on, frames a second112 (at least 1)
  • none of our water draws, frames a second115.8 (at least 1)
  • all on, frames a second112 (at least 1)
  • water off, frames a second127.6 (at least 1)

No screenshot taken.

Positions and messages
Where the character was:
  arrive -8625.00 1328.90 5.60 in 1.0 s
  heading 36.90
  heading 36.90
  pitch -12.40

ashenvale-edge-strips PASS last run 2026-10-15 17:56

The Barrens at the Ashenvale border, flying about 100 yards up and facing the sun over a ridge. Two long dark strips ran down the slope toward the camera (2026-10-04, the owner's screenshot at game time 17:39). Shots in the normal view and in Debug Views 24, 25, 26 and 5.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 24: sun shadows: where the shade comes from (red solid, green leaves, blue hills)

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Debug View 25: sun shadows: shade taken off behind a hill (red solid, green leaves, blue where the check runs)

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Debug View 26: sun shadows: the hill check's depths (red the solid caster before the hill, green behind it, blue the point behind the hill; 15 yards full at terrainBias 1.5)

This run, shot 4
This run
Expected, shot 4
Expected

Shot 5: Debug View 5: sun shadows: the shade alone

  • No strip of full shade across the slope in the shade alone (Debug View 5): the hill's shade there is about 100, the strips were 1row 600 averages 106, its darkest pixel 102 at column 644 (wanted: average any, darkest at least 60)
This run, shot 5
This run
Expected, shot 5
Expected
Positions and messages
Where the character was:
  arrive 1291.80 -3001.20 203.75 in 1.0 s
  pos 1295.8 -3002.4 107.7 107.7 ground |  (on the ground)
  arrive 1291.80 -3001.20 203.03 in 1.0 s
  heading 40.40
  pitch -10.50

ashenvale-river-uphill PASS last run 2026-10-15 17:58

Water uphill (2026-10-11, the owner). Swimming down a river in Ashenvale, looking upstream: about 45 yards out the water was the game's own pale water, cut off along a straight line across the screen. The line was the horizon: the river climbs, and past it the water stood higher than the camera, and the shader dropped it as water seen from below. Then, with it drawn, the river turned darker from 40 yards out: there the map's depth takes over, and a river's vertices carry no depth past about 3 yards (it read as 148). Now the camera is tested against the water's own plane, and a river's depth comes from the map files (NOTES.md, a river above the camera; a river's depth is the map's). Shot 1 as the owner sees it; shot 2 the depth under the water (Debug View 29).

Shot 1: Normal view

  • The far river is our water up to the far end, not the game's pale water: row 174 crosses it about 60 yards upstream, past where the cut lay. 57 after the fix (2026-10-11, measured at 2560 x 1440; the row and columns scaled to 1152 x 864)row 174 averages 54, its darkest pixel 46 at column 498 (wanted: average at most 85, darkest any)
This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 29: water: the depth under it (0 to 256 yards, blue to red, a line at 1, 2, 4, 8 ... 256; hatched: the map's depth)

  • The depth under the far river (Debug View 29) runs on from the near water's blue and cyan: no jump to the deep red and yellow from 40 yards out. The box held 33% of pixels redder than green before the fix (a river read as 148 yards deep), 0.4% after (2026-10-11, measured at 2560 x 1440; the box scaled to 1152 x 864)0.1% of the box is redder than green (at most 5%)
This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive 2207.25 -3040.50 110.96 in 3.4 s
  heading 60.60
  heading 60.60
  pitch -19.50

darkshore-underwater-npcs PASS last run 2026-10-15 17:58

Creatures and some objects under the sea, seen from over the water (2026-10-07, the owner): they lose their texture, show solid white and are too plain through the water. Fog makes it worse, and it is easier to see with sun shadows off (this view has them off). Shot 1: a creature under the water must keep its texture and show dim through the water, not solid white. The cause: over a body the water writes no depth, so the mist's march went on under the surface into its thickest part; and Underwater Cover tripled the water in front of a body at any depth. The mist now ends at the water's surface, and the cover's extra stops after the first yard. Then, at Water Clarity 25, they still showed paler than the water: the depth over them stayed the creature's, so the volumetric light marched on under the surface and added its light there. A second draw now writes the surface's depth over a body under the water.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected
Positions and messages
Where the character was:
  arrive 5724.20 825.80 -1.20 in 1.0 s
  heading 109.60
  heading 109.60
  pitch -18.70

darkshore-water-split PASS last run 2026-10-15 17:58

On the shore by Auberdine, the water split along straight lines: the sea floor showed through a gap in the surface, and with Wave Height 0 it closed (2026-10-07, the owner). The probe: the chunk with its middle at (6650.0 683.3) counts as a lake (swell 0.00 yards), the chunks beside it as the sea (swell 0.80 yards). The swell is set per chunk, so where the two meet one edge rises and falls and the other stays flat. Now the swell is chosen for each of a chunk's points, by the sea cells round it (NOTES.md, the sea and a pond). Shot 1 with the owner's Wave Height 8, shot 2 with Wave Height 0, the unbroken surface to compare.

Shot 1: Normal view

  • The water is whole with the owner's Wave Height 8: no ground shows through it. The box holds open water only; the sea is blue-green there, and the gap between the lake chunk and the sea's showed the brown sea floor across it. Shot 2, Wave Height 0, had no pixel there with more red than green0% of the box is redder than green (at most 0.5%)
This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

  • The same box with Wave Height 0: the check sees no gap where the water is whole0% of the box is redder than green (at most 0.5%)
This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive 6664.70 683.20 5.70 in 1.0 s
  heading 128.60
  heading 128.60
  pitch -39.50

development-body-edge PASS last run 2026-10-15 17:58

A thin light rim along the edge of a character over a shadow: under the feet in its own shadow, and round the head over the guard's (2026-10-08, the owner). The game draws with antialiasing, and an edge pixel's colour is mostly the lit ground behind while its depth can be the body's, out of the shadow: the sun shadows left it lit, with the Sunlight's boost. Where the body mask says the body or a model covers less than half of a pixel, the farthest of its neighbours' depths stands in. Shot 1 in the normal view, shot 2 in the shade alone (Debug View 5), for a look; no check reads them yet.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 5: sun shadows: the shade alone

This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive 4616.20 -452.20 289.79 in 1.0 s
  heading 179.30
  heading 179.30
  pitch -14.60

development-guard-stealth PASS last run 2026-10-15 17:59

On the development map (451), where the Charger test stands, the owner's Stormwind City Guard (a world spawn, guid 2950067, 3.7 yards in front of the start) given Stealth (.aura 1784). The game draws a stealthed unit flat: its depth passes, then its colour passes with a layer after each, against its own depth. Its passes go into a scratch depth, copied from the world's once, at its first depth pass (2026-10-04, a stealthed Pinto with dark spots). A unit's cached shadow goes once it is stealthed, which needs its model, read on the map thread as the unit is first seen (2026-10-05: a half second of shadow as Stealth went on). His helmet, shoulders and weapons are models of their own: they are taken as his within 1.5 yards, or they cast on the ground under a guard with no body, and again with the player standing inside him (2026-10-05, the owner). The test records Stealth going on, takes a shot in stealth, records Stealth going off, then stealths him again, moves the character into him and takes a shot: no shadow of his. It used a Pinto until 2026-10-05, but the game itself leans a stealthing horse forward and draws it black for a second. The guard is left out of stealth after. Then you, stealthed (2026-10-08, a player's report: a rogue in stealth cast a shadow of their own, and no other stealthed unit did): the owner's snapshot at the same place, with the sun 69.2 degrees up, out of the building's shade, the camera 8.996 yards back. The probe before and in stealth, and shots in the shade alone (Debug View 5) before and in stealth, then the normal view.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Debug View 5: sun shadows: the shade alone

  • You, before stealth, in the shade alone (Debug View 5): row 540 crosses your shadow on the ground, at 1152x864, between columns 532 and 576 as the idle pose moves it. Its darkest pixel, not an average: the average over columns 544 to 560, at the shadow's edge, went from 31 to 88 between runs (2026-10-14). 3 in every runrow 540 averages 211, its darkest pixel 3 at column 556 (wanted: average any, darkest at most 30)
This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Debug View 5: sun shadows: the shade alone

  • You in stealth, in the shade alone (Debug View 5): row 540, where your shadow lay, is lit, every pixel from column 500 to 620. 255 after the fix (2026-10-08); with the player left out of the stealthed units, your shadow stayedrow 540 averages 255, its darkest pixel 255 at column -1 (wanted: average any, darkest at least 200)
This run, shot 4
This run
Expected, shot 4
Expected

Shot 5: Normal view

This run, shot 5
This run
Expected, shot 5
Expected

Recording 1: Stealth goes on 1 s in, Normal view

This run
Expected
20 frames of it20 frames of recording 1

Recording 2: Stealth goes off 1 s in, Normal view

This run
Expected
20 frames of it20 frames of recording 2
Positions and messages
Where the character was:
  arrive 4617.60 -452.60 289.60 in 1.0 s
  heading 167.40
  heading 167.40
  pitch -22.00
  arrive 4613.90 -451.70 290.07 in 1.0 s
  heading 167.40
  pitch -22.00
  arrive 4617.30 -452.70 289.66 in 1.0 s
  heading 171.70
  heading 171.70
  pitch -28.20

development-horse-seethrough PASS last run 2026-10-15 18:00

On the development map (451), a Warhorse and a Charger standing beside the player, the camera 11 yards back looking at them. The client drew the Warhorse faded (a depth pass, then its colour blended), and the see-through rule, meant for stealthed units, skipped that depth pass: the horse flashed, see-through and in triangles, standing still (2026-10-04, the owner). The rule now takes a stealthed unit's model alone, and a unit's entry leaves the cache only when no unit near it wears that model. The runner summons the two horses and deletes them after. Shots in the normal view and in Debug View 15 (the bodies).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 15: sun shadows: the bodies it finds

This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive 4611.60 -451.00 290.28 in 1.2 s
  arrive 4613.00 -454.60 290.19 in 1.0 s
  arrive 4617.60 -452.60 289.60 in 1.0 s
  heading 167.40
  heading 167.40
  pitch -22.00

development-saturation PASS last run 2026-10-15 18:00

On the development map (451), the Day Saturation and Night Saturation sliders (2026-10-05). The test client's clock is fixed by comfytime in the day, so Night Saturation must change nothing. Five shots: both at 100 (the game's own colour, no pass), Day Saturation 0 (grey), Day Saturation 200, and Day Saturation 100 with Night Saturation 0 (the game's own colour again), and Day Saturation 0 with the Color Effects box off (the game's own colour, no pass). The UI keeps its colour in each.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Normal view

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Normal view

This run, shot 4
This run
Expected, shot 4
Expected

Shot 5: Normal view

This run, shot 5
This run
Expected, shot 5
Expected
Positions and messages
Where the character was:
  arrive 4617.60 -452.60 289.60 in 1.0 s
  heading 167.40
  heading 167.40
  pitch -22.00

development-windmill PASS last run 2026-10-15 18:00

On the development map (451), a Westfall windmill seen from beside it, flying in its blades' shade, in first person; then 200 yards out, the camera turned all the way round, and back (2026-10-04, the owner). Four faults of its shade, all on this windmill: its parts were too small for the far map one by one (minTriangles), so its shade came in steps; batches of windmills drawn from afar held frozen poses under the turning blades; the windmill's blades, out of view in first person, went as an "older pose" when its tower's edge was drawn; and its stone tower cast as leaves because its sails are alpha tested. The owner's snapshot controls; the owner's snapshot place and sun. Last, from 90 yards, flying, in first person, where its parts must all be in the far map; the probe is taken there. Before going out and after coming back, a 5 s recording in the normal view and one in Debug View 5 (the shade alone), so the blades' shade is seen turning (2026-10-05, the owner); from 90 yards, shots in both views. Since 2026-10-04 the windmill is a record in the object table, its parts filed under it.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 5: sun shadows: the shade alone

This run, shot 2
This run
Expected, shot 2
Expected

Recording 1: beside it, before going out, Normal view

This run
Expected
20 frames of it20 frames of recording 1

Recording 2: beside it, before going out, Debug View 5, Debug View 5: sun shadows: the shade alone

This run
Expected
20 frames of it20 frames of recording 2

Recording 3: after coming back, Normal view

This run
Expected
20 frames of it20 frames of recording 3

Recording 4: after coming back, Debug View 5, Debug View 5: sun shadows: the shade alone

This run
Expected
20 frames of it20 frames of recording 4
Positions and messages
Where the character was:
  arrive 4346.20 -230.40 305.13 in 1.1 s
  pos 4345.0 -230.1 293.8 293.8 ground |  (on the ground)
  arrive 4346.20 -230.40 306.00 in 1.0 s
  heading -139.30
  heading -139.30
  pitch -28.20
  pos 4497.80 -100.00 305.42 - after hop to 200
  heading -49.30
  heading 40.70
  heading 130.70
  heading -139.30
  pos 4346.20 -230.40 305.23 - after hop to 0
  heading -139.30
  pitch -28.20
  arrive 4385.70 -301.90 313.71 in 1.0 s
  heading 122.10
  pitch -11.50

elwynn-own-face PASS last run 2026-10-15 18:02

The owner's own character with the camera 1.8 yards back, where the game fades it as it fades a stealthed unit (2026-10-04, the owner). The see-through rule once took that fade for stealth and the face showed through the back of the head; the rule now takes stealthed units alone, and their passes go into a scratch depth. Nothing of the character may be taken as stealthed. One shot in the normal view.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected
Positions and messages
Where the character was:
  arrive -9433.20 -1401.20 46.66 in 1.0 s
  heading -167.80
  heading -167.80
  pitch -16.20

elwynn-ridge-fog PASS last run 2026-10-15 18:02

Standing in eastern Elwynn, first person, looking at ridges one behind another. The fog makes a second ridgeline: it does not fade smoothly into the terrain, and each ridge shows twice (2026-10-05, the owner). A shot with fog off (comfyMist 0), then with fog on; with fog on there must be no second ridgeline that stands out. Then Debug View 12 (how much of the light gets through the fog) and Debug View 14 (where mist collects). No check reads the shots yet: the owner judges them.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Debug View 12: fog: how much gets through (white = clear)

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Debug View 14: fog: where mist collects (low ground, water)

This run, shot 4
This run
Expected, shot 4
Expected
Positions and messages
Where the character was:
  arrive -9416.70 -2248.00 67.80 in 1.0 s
  heading 53.00
  heading 53.00
  pitch 11.70

elwynn-stump-edge PASS last run 2026-10-15 18:02

In eastern Elwynn, the back of a tree stump, turned away from the sun. Its shade stopped short of the top edge: a lighter strip along it, about 0.1 yards (2026-10-05, the owner). The shadow lookup moves each point a little along its facing (normalBias); the stump's back leans in toward its top, so its facing points a little up, and near the edge the point rose over the stump into the sun. On a face turned from the sun the point now moves straight away from the sun. Shots in the normal view and in Debug View 5 (the shade alone).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 5: sun shadows: the shade alone

  • The back face's rim is in the stump's shade up to the top edge, in the shade alone (Debug View 5): row 312 crosses the rim, which the camera sees from below its top. Before the fix columns 520 to 690 averaged 155 (lit), after it 39. Row 222 until 2026-10-07, placed at 1280x800: at 1152x864 it ran over the trees behind the stump, about 45 rows above its toprow 312 averages 0, its darkest pixel 0 at column 520 (wanted: average at most 80, darkest any)
This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive -9413.20 -2235.60 67.37 in 1.0 s
  heading 61.10
  heading 61.10
  pitch -11.80

elwynn-trough-shadow PASS last run 2026-10-15 18:03

Standing in the water trough at the Eastvale paddock, the camera zoomed in. The trough's shadow got a character's extra darkness: a rule took any model within 3 yards of the player for the player's (2026-10-04, the owner). The trough must not be marked a body.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected
Positions and messages
Where the character was:
  arrive -9439.20 -1377.30 47.20 in 1.0 s
  heading -2.40
  heading -2.40
  pitch -40.00

fargodeep-spell-shade PASS last run 2026-10-15 18:03

Inside Fargodeep Mine, the lower level, with Lightning Shield, Mana Shield and Inner Fire on the character. Spells showed dark in caves and in shade (2026-10-12, the owner): the sun shadows and the fog ran after the spells and judged each pixel by the wall behind it. Since then the game's additive draws are held and drawn after the shade ([general] spellsOnTop). Shots: no aura; the auras; the auras with spellsOnTop 0 (the old order); Sun Shadows off; the fog off. With spellsOnTop the auras should be as bright in shot 2 as in shots 4 and 5.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Normal view

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Normal view

This run, shot 4
This run
Expected, shot 4
Expected

Shot 5: Normal view

This run, shot 5
This run
Expected, shot 5
Expected
Positions and messages
Where the character was:
  arrive -9840.60 161.10 4.79 in 1.0 s
  heading 90.00
  heading 90.00
  pitch -15.00

far-terrain-cache PASS last run 2026-10-15 18:03

Hop 300 yards away from a hill in the Barrens and back. The game draws far ground with its coarse mesh (64 to 76 triangles a chunk) through a shader the terrain test does not know; the cache must not keep those draws once you are back, or their full shade lies over the hill in big triangles (2026-10-03).

Shot 1: Debug View 24: sun shadows: where the shade comes from (red solid, green leaves, blue hills)

This run, shot 1
This run
Expected, shot 1
Expected
Positions and messages
Where the character was:
  arrive 1191.20 -2740.90 211.30 in 1.0 s
  pos 1192.3 -2740.9 211.3 211.3 ground |  (on the ground)
  arrive 1182.20 -2735.20 307.96 in 1.0 s
  heading 40.10
  heading 40.10
  pitch -16.70
  pos 949.10 -2924.00 307.63 - after hop to 300
  pos 1182.20 -2735.20 307.41 - after hop to 0

ironforge-ah-glow PASS last run 2026-10-15 18:04

On the road outside Ironforge's gate, facing the statue in the hall (2026-10-05, the owner at game time 17:39). The auction house braziers behind the statue glowed through the hall's walls: the fog took them as 100 yards and more under its ground (the floor under the terrain is looked for no more than 4 yards over your feet, and theirs is higher), so Lamps in Mist made them 24 times as bright. A shot in the normal view and in Debug View 6 (the lamps' glow alone). The probe waits 45 s: 15 s after a start the buildings were still loading (197 lights of 1,057, and no floors under the terrain).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 6: lamps: the glow alone

This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive -5037.50 -816.60 495.10 in 1.0 s
  heading -51.50
  pitch -12.00

ironforge-gate-fog PASS last run 2026-10-15 18:05

Outside Ironforge's gate, at the foot of the mountain the city lies under. The fog was thick enough to hide the trees 60 yards off (2026-10-04, the owner at game time 17:39). Shots in the normal view and in Debug Views 12 (how much gets through) and 14 (where mist collects).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 12: fog: how much gets through (white = clear)

  • The road and the trees show through the fog (Debug View 12, white = clear): row 300 averaged 11 when the mountain lifted the fog's groundrow 300 averages 221, its darkest pixel 213 at column 200 (wanted: average at least 60, darkest any)
This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Debug View 14: fog: where mist collects (low ground, water)

This run, shot 3
This run
Expected, shot 3
Expected
Positions and messages
Where the character was:
  arrive -5030.80 -820.80 495.10 in 1.2 s
  heading 108.00
  pitch -22.00

outdoor-spell-order PASS last run 2026-10-15 18:05

Where the additive draws fall in the frame outdoors (2026-10-12): Redridge's grass, Goldshire's street with its lamps, and the bridge into Stormwind, with Lightning Shield, Mana Shield and Inner Fire on. The probe lists every depth-writing draw after the first additive one: what would miss the sun shadows and the fog if they ran there. Since spellsOnTop (2026-10-12) each probe also gives how many additive draws were held, and how many were drawn early. By Goldshire a shot with spellsOnTop 0 follows, the old order.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Normal view

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Normal view

This run, shot 4
This run
Expected, shot 4
Expected
Positions and messages
Where the character was:
  arrive -9467.80 -2251.20 74.40 in 1.0 s
  heading 147.60
  heading 147.60
  pitch -25.90
  arrive -9464.60 62.30 55.87 in 1.0 s
  heading 0.00
  heading 0.00
  pitch -10.00
  arrive -8983.20 497.30 96.46 in 1.0 s
  heading 40.80
  heading 40.80
  pitch -5.00

redridge-cloud-shapes PASS last run 2026-10-15 18:06

Our clouds (2026-10-08, Chiro's brief: soft clouds, and now and then one with a shape, for cloud watching; then "they need to merge in nicely with the other clouds"). On open ground at Lakeshire in Redridge, the camera 25 degrees up. Shots 1 to 7: each shape formed ahead of the camera ([clouds] testShape 0 to 6: bunny, cat, fish, kodo, longneck, turtle, whale). Shot 8: the kodo in Debug View 31 (red the shapes, green the other clouds, blue the high layer). Shots 9 and 10: the kodo with [clouds] clearing 0.3 and 0.9 (the plain clouds near it fade). Shot 11: the sky as it is. The probe must show our clouds drawn in place of the game's. The owner and Chiro judge the shots.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Normal view

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Normal view

This run, shot 4
This run
Expected, shot 4
Expected

Shot 5: Normal view

This run, shot 5
This run
Expected, shot 5
Expected

Shot 6: Normal view

This run, shot 6
This run
Expected, shot 6
Expected

Shot 7: Normal view

This run, shot 7
This run
Expected, shot 7
Expected

Shot 8: Debug View 31: clouds: the shapes (red), the layer (blue)

This run, shot 8
This run
Expected, shot 8
Expected

Shot 9: Normal view

This run, shot 9
This run
Expected, shot 9
Expected

Shot 10: Normal view

This run, shot 10
This run
Expected, shot 10
Expected

Shot 11: Normal view

This run, shot 11
This run
Expected, shot 11
Expected
Positions and messages
Where the character was:
  arrive -9416.70 -2248.00 67.80 in 1.2 s
  heading 53.00
  heading 53.00
  pitch 25.00

redridge-grass PASS last run 2026-10-15 18:07

From the owner's snapshot in Redridge's grass, with Foliage Density at 128 (put back at the end). comfyatmos.dll draws the grass in the wind since 2026-10-06 (comfygrass until then). The probe must show grass draws and the fill loop patched. Recordings with the grass on, off, and while walking through it (the parting); shots in the normal view and in Debug View 30 (the bend: black still, white the tips).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 30: grass: the bend (black still, white the tips; blue where it comes from the texture)

This run, shot 2
This run
Expected, shot 2
Expected

Recording 1: grass on, Normal view

This run
Expected
20 frames of it20 frames of recording 1

Recording 2: grass off, Normal view

This run
Expected
20 frames of it20 frames of recording 2

Recording 3: walking through it, Normal view

This run
Expected
20 frames of it20 frames of recording 3
Positions and messages
Where the character was:
  arrive -9467.80 -2251.20 74.40 in 1.0 s
  heading 147.60
  heading 147.60
  pitch -25.90

redridge-grass-shadow PASS last run 2026-10-15 18:07

The sun shadows on the grass and ferns in Redridge with Shadow Resolution at 2048 (2026-10-08, the owner: a problem with the shadow map at 2048). A recording of 5 seconds in the normal view as the grass moves in the wind, a shot in the normal view and one in the shade alone (Debug View 5), for a look; no check reads them yet.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 5: sun shadows: the shade alone

This run, shot 2
This run
Expected, shot 2
Expected

Recording 1: The grass in the wind, Shadow Resolution 2048, Normal view

This run
Expected
20 frames of it20 frames of recording 1
Positions and messages
Where the character was:
  arrive -9483.10 -2239.60 76.00 in 1.0 s
  heading 101.50
  heading 101.50
  pitch -22.90

stormwind-canal-fog PASS last run 2026-10-15 18:08

On the bank of the canal outside Stormwind's gate, looking over the water toward the bridge. The fog there was thick enough to hide the far bank (2026-10-04, the owner at game time 06:45). Shots in the normal view and in Debug Views 12 (how much gets through) and 14 (where mist collects).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 12: fog: how much gets through (white = clear)

  • The far side of the canal shows through the fog (Debug View 12, white = clear): it averaged 7 when low ground and water both thickened itrow 250 averages 176, its darkest pixel 156 at column 644 (wanted: average at least 25, darkest any)
This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Debug View 14: fog: where mist collects (low ground, water)

This run, shot 3
This run
Expected, shot 3
Expected
Positions and messages
Where the character was:
  arrive -8997.40 406.60 73.10 in 1.0 s
  heading 45.60
  pitch -10.70

stormwind-canal-wake PASS last run 2026-10-15 18:08

Swimming along a canal inside Stormwind, the camera looking down from above. No ripple and no wake showed round the swimmer (2026-10-04, the owner). The canal is a building's water, which the map tiles do not hold: its surface comes from the city's building in the files (2026-10-12), so the test waits 45 s at the start for Stormwind to load. Shots in the normal view and in Debug View 20 (ripples red and green, the wake blue).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 20: water: ripples (red, green) and the wake (blue)

This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive -8779.50 788.50 94.20 in 1.0 s
  heading -50.90
  heading -50.90
  pitch -80.00

stormwind-game-glow PASS last run 2026-10-15 18:09

On the bridge into Stormwind, facing the gate, where the game's Full Screen Glow washes the bridge out (2026-10-13, the owner: "the full screen glow is quite bright"). Shots with Game Glow at 100 (the game's own), 50, 0 and 200. For a look; no check reads the shots.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Normal view

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Normal view

This run, shot 4
This run
Expected, shot 4
Expected
Positions and messages
Where the character was:
  arrive -8983.20 497.30 96.46 in 1.0 s
  heading 40.80
  heading 40.80
  pitch -5.00

stormwind-harbour-ridge PASS last run 2026-10-15 18:10

A ridge under the sea in Stormwind's harbour, far terrain textured and not, showed as a dark shape with a hard edge against the open sea beside it (2026-10-06, the owner). The cause was the sun shadows: their Sunlight and sun tint faded with the bed over the ridge while the open sea, with no bed under it, kept them. Shot 1: the normal view, the water one colour from the open sea across the ridge, no edge. Shot 2: Debug View 28, blue over the ridge (the shadows find the water over a bed), grey over the open sea.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 28: sun shadows: the water it finds (blue: the water's depth over a bed, grey: none, so the shade falls on what the depth shows)

This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive -8625.00 1328.90 5.60 in 1.0 s
  heading 36.90
  heading 36.90
  pitch -12.40

stormwind-harbour-ship-shadow PASS last run 2026-10-15 18:10

A moored ship's shadow under the water, seen from the dock (2026-10-06, the owner: under the water the ship's and the dock's shadows show on the sea floor; from above they should too). Shot 1: the normal view. Shot 2: Debug View 5, the shade alone: the soft shade on the water's surface beside the hull (Shadow on Water). Shot 3: Debug View 24, where the shade comes from, red solid, on the floor where the shadows find it. Shot 4: Debug View 28, blue where the shadows find the floor under the water.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 5: sun shadows: the shade alone

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Debug View 24: sun shadows: where the shade comes from (red solid, green leaves, blue hills)

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Debug View 28: sun shadows: the water it finds (blue: the water's depth over a bed, grey: none, so the shade falls on what the depth shows)

This run, shot 4
This run
Expected, shot 4
Expected
Positions and messages
Where the character was:
  arrive -8605.60 1278.10 5.20 in 1.0 s
  pos -8604.6 1278.8 5.2 5.2 ground |  (on the ground)
  arrive -8603.80 1374.00 36.71 in 1.0 s
  heading -24.20
  heading -24.20
  pitch -36.90

stormwind-lighthouse-light PASS last run 2026-10-15 18:11

Stormwind's harbour lighthouse from the shore, 327 yards off (2026-10-07, the owner): the game's own lighthouse light showed beside ours, and ours showed from too far, with its glitter on the sea past the beam's end. The search for the game's light (LIGHTHOUSEEFFECT) took the first 64 animated doodads of any name, and the harbour has more, so the game's light was not left out and our lamp came from the building's box. Now only lighthouse doodads are counted. A lighthouse further than Lighthouse Distance is not drawn and fades out over the last quarter, and the beam's patch on the water ends at Beam Length. Shot 1 and a 10 s video: one lamp in the lamp room, no second light by it, the beam turning, its glitter only as far as the beam reaches. At 1:00 by comfytime (config hour, 2026-10-07): the run on the release DLL had taken the client's hour and came out by day.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Recording 1: the beam turning, from the shore, Normal view

This run
Expected
20 frames of it20 frames of recording 1
Positions and messages
Where the character was:
  arrive -8276.20 1371.90 5.98 in 1.0 s
  heading 56.30
  heading 56.30
  pitch 10.10

stormwind-tower-speckle PASS last run 2026-10-15 18:11

On the bridge into Stormwind, facing the gate with the sun behind it. A band of the left tower, where the sun grazes it, showed a speckled shade (2026-10-04, the owner at game time 17:39). Shots in the normal view and in Debug View 5 (the shade alone).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 5: sun shadows: the shade alone

  • No speckled shade on the left tower where the sun grazes it (Debug View 5): 20% of the box jumped at normalBias 2, none at 41% of the box jumps from one pixel to the next (at most 5%)
This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive -8983.20 497.30 96.46 in 1.0 s
  heading 40.80
  heading 40.80
  pitch 15.00

sun-camera-turn PASS last run 2026-10-15 18:12

The sun must not move when the camera turns (2026-10-14). A WOW-HC player saw the shadows change as they turned the camera: the sun was read from the sprite the sky draws, and the sky draws only the sprites in view, so with the sun out of view a moon was taken for the sun. The sun now comes from the clock's table (src/sunpath.cpp). At 11:45 the camera looks at the sun, away from it, and up; at 01:30 away from the moons and at them. In every probe the volumetric light's sun must be the table's: azimuth 45, elevation 82.5 by day (0.09 0.09 0.99), the larger moon at 31.3 at night (0.60 0.60 0.52).

No screenshot taken.

Positions and messages
Where the character was:
  arrive -9416.70 -2248.00 67.80 in 1.0 s
  heading 45.00
  heading 45.00
  pitch 70.00
  heading -135.00
  pitch 5.00
  heading 135.00
  pitch 45.00
  heading -135.00
  pitch 5.00
  heading 90.00
  pitch 30.00

sunset PASS last run 2026-10-15 18:20

The sun setting over the sea, with the owner's settings (2026-10-08). Here the fog and the water at sunset were tuned: no fog over the water, the hard cut under the sun, the fog's glow toward the sun and along the water's horizon, the far sea's dark strip, the white dots of the water's cracks. No fixed sun: the hour places it. Shot 1: a beach of Tirisfal Glades' north coast at 20:30, under its green sky. Shot 2: the mouth of Booty Bay at 20:25, the sun past the cliff, the statue and a ship in silhouette. In the normal view, for a look; no check reads them yet.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive 3005.40 325.80 2.50 in 2.5 s
  heading 38.40
  heading 38.40
  pitch 17.00
  arrive -14147.50 505.80 1.29 in 1.0 s
  heading 69.90
  heading 69.90
  pitch 11.80

sun-table PASS last run 2026-10-15 18:12

Measures where the sky draws the sun and the two moons at each half hour, for the table of the sun by the clock (src/sunpath.cpp, 2026-10-14). [sun] measure logs each sky quad's world direction, its texture and the game time. The sky draws a quad only where the camera can see it, so the camera points in 18 directions (6 headings 60 degrees apart, at pitches 5, 45 and 80, which cover the whole sky) and the hour steps through the day at each one. Then run tests\Sun-Table.ps1 to turn the log into the table. No checks: the table is the result. Takes about 8 minutes. The steps are written by a loop; change the loop in the commit that adds this file, not the steps by hand.

No screenshot taken.

Positions and messages
Where the character was:
  arrive -9416.70 -2248.00 67.80 in 1.0 s
  heading 45.00
  heading 45.00
  pitch 5.00
  heading 45.00
  pitch 45.00
  heading 45.00
  pitch 80.00
  heading 105.00
  pitch 5.00
  heading 105.00
  pitch 45.00
  heading 105.00
  pitch 80.00
  heading 165.00
  pitch 5.00
  heading 165.00
  pitch 45.00
  heading 165.00
  pitch 80.00
  heading -135.00
  pitch 5.00
  heading -135.00
  pitch 45.00
  heading -135.00
  pitch 80.00
  heading -75.00
  pitch 5.00
  heading -75.00
  pitch 45.00
  heading -75.00
  pitch 80.00
  heading -15.00
  pitch 5.00
  heading -15.00
  pitch 45.00
  heading -15.00
  pitch 80.00

telabim-wet-sand PASS last run 2026-10-15 18:20

On a jungle beach east of Tanaris (Tel'Abim, by the map position) the wet sand was broken: a dark band on part of the shore, pieces with straight edges in the middle, none on the rest (2026-10-07, the owner). The wet sand pass drew only on ground under 32 degrees of slope, which keeps bodies and posts dry; the bank here is steeper, and the slope is per terrain triangle, so the band came and went triangle by triangle. Now full up to 60 degrees, none past 72 (NOTES.md, the wet sand on a steep bank). Shot 1 in the normal view, shot 2 in the wet sand alone (Debug View 18), shot 3 in the normal view with the Wet Sand slider at 0 (2026-10-07: the slider is new). Then Old Hillsbrad (the Caverns of Time, map 269), the owner's snapshot over a river, with their settings (2026-10-08): the wet sand on the far bank lay as a contour on the grass, well over the water, with a step at each map cell's edge. A river runs downhill across a chunk, and each map cell took the chunk's highest water level; now the mean of its four points, and the wet pass weighs the cells round a point by how near they are. Shots 4 to 6 as 1 to 3.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 18: water: the wet sand alone

  • The wet sand alone (Debug View 18): row 300 crosses the band on the steep part of the bank, where it was missing. 84 after the fix (2026-10-07); under 10 before itrow 300 averages 84, its darkest pixel 6 at column 468 (wanted: average at least 40, darkest any)
  • The wet sand alone (Debug View 18): row 340 crosses the band on the steep part of the bank, where it was missing. 132 after the fix (2026-10-07); under 10 before itrow 340 averages 132, its darkest pixel 4 at column 568 (wanted: average at least 40, darkest any)
  • The wet sand alone (Debug View 18): row 380 crosses the band on the steep part of the bank, where it was missing. 155 after the fix (2026-10-07); under 10 before itrow 380 averages 155, its darkest pixel 4 at column 560 (wanted: average at least 40, darkest any)
  • The wet sand alone (Debug View 18): row 420 crosses the band on the steep part of the bank, where it was missing. 179 after the fix (2026-10-07); under 10 before itrow 420 averages 179, its darkest pixel 4 at column 670 (wanted: average at least 40, darkest any)
This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Normal view

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Normal view

This run, shot 4
This run
Expected, shot 4
Expected

Shot 5: Debug View 18: water: the wet sand alone

  • Old Hillsbrad, the wet sand alone (Debug View 18): row 450 crosses the far bank's grass, 40 rows over the waterline. Before the fix (2026-10-08, the owner) the band lay as a contour on the grass of this gentle bank, well over the water: each map cell took its chunk's highest water level, up to a yard over a river running downhillrow 450 averages 41, its darkest pixel 41 at column 899 (wanted: average at most 60, darkest any)
  • Old Hillsbrad, the wet sand alone (Debug View 18): row 491 crosses the band at the far bank's waterline (rows 488 to 494 at column 900 after the fix)row 491 averages 200, its darkest pixel 197 at column 899 (wanted: average at least 120, darkest any)
  • Old Hillsbrad, the wet sand alone (Debug View 18): row 470, further along the far bank, 45 rows over the waterlinerow 470 averages 39, its darkest pixel 38 at column 1003 (wanted: average at most 60, darkest any)
  • Old Hillsbrad, the wet sand alone (Debug View 18): row 518 crosses the band at the waterline there (rows 515 to 522 at column 1000 after the fix)row 518 averages 215, its darkest pixel 214 at column 999 (wanted: average at least 120, darkest any)
This run, shot 5
This run
Expected, shot 5
Expected

Shot 6: Normal view

This run, shot 6
This run
Expected, shot 6
Expected
Positions and messages
Where the character was:
  arrive -7816.70 -7016.70 8.60 in 1.0 s
  pos -7816.3 -7015.6 8.6 8.6 ground |  (on the ground)
  arrive -7858.40 -6997.90 5.30 in 1.0 s
  heading -4.80
  heading -4.80
  pitch -21.90
  arrive 2202.60 669.10 46.90 in 1.0 s
  heading -69.80
  heading -69.80
  pitch -13.90

water-standing PASS last run 2026-10-15 18:21

From the owner's snapshot at the edge of Redridge's lake: a shot there, then about 5 yards forward into the shallows and a shot standing still. A character standing still in the water had foam round its body: the foam round objects (Object Foam) took it for a post (2026-10-06, the owner). Only a body that moves may have foam, from its wake. Each shot also in Debug View 17 (the foam alone).

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Debug View 17: water: the foam alone

This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Normal view

This run, shot 3
This run
Expected, shot 3
Expected

Shot 4: Debug View 17: water: the foam alone

  • In the shallows, standing still, Debug View 17 (the foam alone): no foam round the character. Row 540 crosses its legs; before the fix the foam round a body standing still averaged about 130 on such a rowrow 540 averages 12, its darkest pixel 5 at column 584 (wanted: average at most 50, darkest any)
This run, shot 4
This run
Expected, shot 4
Expected
Positions and messages
Where the character was:
  arrive -9389.40 -2230.70 56.70 in 1.0 s
  heading -3.80
  heading -3.80
  pitch -40.00

westfall-beach-swash PASS last run 2026-10-15 18:22

The swash on a Westfall beach, from 40 yards up: 10 second recordings at the defaults (Swash Height 5, Length 55, Speed 80), then with one slider moved each. At Height 100 the water must stop at the wet sand's height, not run onto dry sand (2026-10-05, the owner). The sliders replaced a Swash slider whose 5 to 100 changed nothing.

Recording 1: The defaults: Height 5, Length 55, Speed 80, Normal view

This run
Expected
20 frames of it20 frames of recording 1

Recording 2: Swash Height 100: no higher than the wet sand, Normal view

This run
Expected
20 frames of it20 frames of recording 2

Recording 3: Swash Length 10: shorter surges, Normal view

This run
Expected
20 frames of it20 frames of recording 3

Recording 4: Swash Speed 300, Normal view

This run
Expected
20 frames of it20 frames of recording 4
Positions and messages
Where the character was:
  arrive -9605.70 1337.30 39.28 in 1.0 s
  pos -9604.1 1337.2 0.1 0.1 ground |  (on the ground)
  arrive -9605.70 1337.30 39.32 in 1.0 s
  heading -104.80
  heading -104.80
  pitch -44.80

westfall-far-waterline PASS last run 2026-10-15 18:23

The waterline seen from far off: from 66.7 yards up, the shore about 90 yards away. Our water's edge was jagged there and the water showed over the terrain (2026-10-05, the owner): the water must end where the terrain rises out of it, with no swash needed. Shot 1 is our water, shot 2 the game's own (Water Effects off), to compare the line.

Shot 1: Normal view

This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

This run, shot 2
This run
Expected, shot 2
Expected
Positions and messages
Where the character was:
  arrive -9591.40 1374.90 65.14 in 1.0 s
  arrive -9591.40 1374.90 66.20 in 1.0 s
  heading -109.60
  heading -109.60
  pitch -45.00

westfall-under-the-swell PASS last run 2026-10-15 18:23

Swimming off the Westfall coast with Wave Height 30, the camera just over the game's flat water and under our swell: the sea floor showed as dry sand in clear air, and the game drew no underwater fog (2026-10-07, the owner). The game draws its underwater view only with the camera under its own flat water; our swell rose up to 3 yards over that. Now the swell never rises over the camera near it (the owner's choice: within 15 yards it keeps 0.3 yards under the camera, and grows back to its full height by 40), and a wave further out that stands as high as the camera is drawn as water seen from the front (NOTES.md, the camera inside a wave). Shots 1 and 2 two seconds apart (the swell moves): the sea floor through green water, the waves on the horizon. Shot 3 from 3 yards deeper, the camera under the flat water: the game's own underwater view.

Shot 1: Normal view

  • The sea floor under the camera, seen through the water: blue-green, not the dry sand's orange. Shot 10% of the box is redder than green (at most 5%)
This run, shot 1
This run
Expected, shot 1
Expected

Shot 2: Normal view

  • The sea floor under the camera, seen through the water: blue-green, not the dry sand's orange. Shot 20% of the box is redder than green (at most 5%)
This run, shot 2
This run
Expected, shot 2
Expected

Shot 3: Normal view

  • The sea floor under the camera, seen through the water: blue-green, not the dry sand's orange. Shot 30% of the box is redder than green (at most 5%)
This run, shot 3
This run
Expected, shot 3
Expected
Positions and messages
Where the character was:
  arrive -9570.30 1331.90 -1.20 in 1.0 s
  heading -12.80
  heading -12.80
  pitch 0.70
  arrive -9570.30 1331.90 -4.20 in 1.0 s
  heading -12.80
  heading -12.80
  pitch 0.70
  arrive -9570.30 1331.90 -1.20 in 1.0 s
  heading -12.80