Bloom
Bloom is the map effects plugin’s emphasis for dark and driving styles. Lit roads, traffic tubes and route lines glow. The playground below has every bloom knob on one panel, including the colour scope:
Turning it on
Bloom is off until bloom.intensity is above 0. bloom.threshold sets how bright a pixel must be to glow, and bloom.radius sets how far the glow spreads:
import { MapEffects } from '@tomtom-org/maps-sdk-plugin-map-effects';
const effects = new MapEffects(map);effects.updateConfig({ bloom: { intensity: 0.5, threshold: 0.6 } });Bloom reads back the map canvas, so the map needs preserveDrawingBuffer: true.
| Knob | Range | Default |
|---|---|---|
bloom.intensity, bloom.threshold | 0–1 | 0 (off), 0.55 |
bloom.radius (CSS px) | 2–40 | 12 |
bloom.only | list of style colour knobs, groups and CSS colours | [] (the whole frame) |
bloom.onlyTolerance | 0–1 | 0.15 |
Scoping bloom by colour
bloom.only lists the colours bloom may light. Entries mix freely, and the default [] lights the whole frame.
import { setKnob } from '@tomtom-org/maps-sdk/map';import { effectKnobCatalogue } from '@tomtom-org/maps-sdk-plugin-map-effects';
effects.updateConfig({ bloom: { intensity: 0.9, only: ['traffic'] } }); // a group of style colourssetKnob(effects, effectKnobCatalogue, 'bloom.only', ['traffic.incidents.colors.major', 'traffic.incidents.colors.closed']); // single knobs
const routeColor = '#1a73e8'; // the color your RoutingModule draws routes insetKnob(effects, effectKnobCatalogue, 'bloom.only', ['traffic', routeColor]); // plus a CSS colour of your own| Entry | Resolves to |
|---|---|
A style colour knob by its map-wide id, e.g. colors.roadMajor, traffic.flow.colors.slow, pois.label.color | the colour the loaded style paints it in |
A group of them (StyleColorKnobGroup), e.g. traffic, traffic.incidents, colors | every colour knob whose id starts with it |
A CSS colour, e.g. '#1a73e8' | itself — for what no style knob paints, such as a route in the color you gave RoutingModule |
- The names come from the SDK’s
styleColorKnobIds, so you can scope a colour knob that any module gains without changing anything here.effectKnobCataloguelists them in the knob’soptions. An entry that is neither a name nor a CSS colour throwsRangeError. - A scope keys on colour, not on layers. The effects see the rendered map as one flat image, so bloom keeps the pixels in a listed colour.
- It follows the style. Each name is read with
getStyleColor, so a recolour or a style switch moves the scope with nothing to keep in sync. A name resolves without any module. - Anything else in those colours glows too, since a colour key can’t tell it from traffic.
- Only what the style paints differently can be separated. The TomTom styles give flow and incidents one palette (
traffic.flow.colors.stationaryistraffic.incidents.colors.major), sotraffic.flowalso keys those incidents. - A colour no literal stands for (a data-driven expression) scopes to nothing. Bloom then lights the whole frame, with one console warning.
- It follows the style. Each name is read with
- Bloom doesn’t compare brightness. An antialiased edge and its lit centre are one colour at two levels, and
bloom.thresholdjudges level.bloom.onlyTolerancecovers the blending an edge picks up. Raise it if edges drop out, lower it if a neighbouring severity lights up.- Its
0.15default keeps a moderate jam out of atraffic.incidents.colors.majorscope, since the moderate colour sits0.217from the major one.
- A scope lets you lower the cut. With the city keyed out by colour,
bloom.thresholdcan sit under the darkest thing worth lighting.monoDarkpaints a major jamhsl(0, 100%, 28%). Of that colour, 64/255 survives a0.45cut and 110/255 survives a0.25one.- The Traffic flow with bloom example cuts at
0.25, with a grade deepening the city the traffic glows against.
How it renders
Bloom is neither a GPU pass nor a CSS overlay. It is a canvas at a quarter of the pixels, which the plugin redraws every frame and blends in screen mode. A glow needs the original and its blur, which a backdrop-filter can’t give. Bloom draws from the GPU chain’s output, so it glows over the depth of field’s defocus. If a pass of your own shifts hues, a scope may need a wider bloom.onlyTolerance to find its colours. Keep bloom.radius moderate on large canvases.
Related guides and examples
Related guides
- Map effects plugin - Setup, how the effects render, and every knob
- Map styling - The map-wide colour ids
bloom.onlynames, andgetStyleColor - Traffic flow and Traffic incidents - The traffic a scoped bloom lights, and its colours
Related examples
- Bloom playground - Every bloom knob, the colour scope included
- Traffic flow with bloom - Live traffic glowing over a dark map