DOCS v0.1.13 github

@hatch:postfx v0.2.0

Common post-processing effects for the WrenLift game framework. Tonemap, Vignette, Bloom, FXAA, ColorGrade, ChromaticAberration, OutlinePass, SkyPass — each a PostPass subclass that drops into g.postFX = PostFX.new(g) from @hatch:game. Effects ship here so the engine stays lean; new effects can be added without bumping @hatch:game.

stable system updated Jun 6, 2026 source ↗
$ hatch add @hatch:postfx

MOD bloom

CL Bloom

NEW Bloom.new(opts: Map)

NEW Bloom.new()

GET Bloom.threshold → Num

SET Bloom.threshold=(v: Num)

GET Bloom.knee → Num

SET Bloom.knee=(v: Num)

GET Bloom.intensity → Num

SET Bloom.intensity=(v: Num)

GET Bloom.levels → Num

GET Bloom.filterRadius → Num

SET Bloom.filterRadius=(v: Num)

GET Bloom.name

GET Bloom.stepCount

FN Bloom.static numOr_(opts, key, fallback)

FN Bloom.static intOr_(opts, key, fallback)

FN Bloom.requestTargets(width, height)

FN Bloom.onAdded_(orchestrator)

FN Bloom.buildPipelineOneInput_(fragmentWgsl, targetFormat, blendMode)

FN Bloom.buildPipelineTwoInputs_(fragmentWgsl, targetFormat, blendMode)

FN Bloom.cacheBindGroup_(layout, entries, key)

FN Bloom.dispatchStep_(orchestrator, encoder, ctx)

FN Bloom.runThreshold_(encoder, inputView, outputView)

FN Bloom.runDownsample_(encoder, inputView, outputView)

FN Bloom.runUpsample_(encoder, inputView, outputView)

FN Bloom.runComposite_(encoder, sceneView, bloomView, outputView)

FN Bloom.static SHADER_THRESHOLD_

FN Bloom.static SHADER_DOWNSAMPLE_

FN Bloom.static SHADER_UPSAMPLE_

FN Bloom.static SHADER_COMPOSITE_

MOD painted_sky

CL SkyPass

NEW SkyPass.new(opts: Map)

NEW SkyPass.new()

GET SkyPass.name

GET SkyPass.zenith → List

SET SkyPass.zenith=(v: List)

GET SkyPass.horizon → List

SET SkyPass.horizon=(v: List)

GET SkyPass.falloff → Num

SET SkyPass.falloff=(v: Num)

GET SkyPass.wantsDepth

GET SkyPass.uniformBytes

GET SkyPass.uniformWgsl

GET SkyPass.fragmentBody

FN SkyPass.init_(opts)

FN SkyPass.writeUniforms(scratch)

MOD postfx

CL Cfg_

FN Cfg_.static numOr(opts, key, fallback)

FN Cfg_.static vec3Or(opts, key, fallback)

CL Tonemap

NEW Tonemap.new(opts: Map)

NEW Tonemap.new()

GET Tonemap.exposure → Num

SET Tonemap.exposure=(v: Num)

GET Tonemap.name

GET Tonemap.uniformBytes

GET Tonemap.uniformWgsl

GET Tonemap.fragmentBody

FN Tonemap.writeUniforms(scratch)

CL Vignette

NEW Vignette.new(opts: Map)

NEW Vignette.new()

GET Vignette.strength → Num

SET Vignette.strength=(v: Num)

GET Vignette.radius → Num

SET Vignette.radius=(v: Num)

GET Vignette.softness → Num

SET Vignette.softness=(v: Num)

GET Vignette.name

GET Vignette.uniformBytes

GET Vignette.uniformWgsl

GET Vignette.fragmentBody

FN Vignette.writeUniforms(scratch)

CL FXAA

NEW FXAA.new(opts: Map)

NEW FXAA.new()

GET FXAA.subpixel → Num

SET FXAA.subpixel=(v: Num)

GET FXAA.edgeThreshold → Num

SET FXAA.edgeThreshold=(v: Num)

GET FXAA.edgeThresholdMin → Num

SET FXAA.edgeThresholdMin=(v: Num)

GET FXAA.name

GET FXAA.uniformBytes

GET FXAA.uniformWgsl

GET FXAA.fragmentBody

FN FXAA.writeUniforms(scratch)

CL ColorGrade

NEW ColorGrade.new(opts: Map)

NEW ColorGrade.new()

GET ColorGrade.lift → List<Num>

SET ColorGrade.lift=(v: List<Num>)

GET ColorGrade.gamma → List<Num>

SET ColorGrade.gamma=(v: List<Num>)

GET ColorGrade.gain → List<Num>

SET ColorGrade.gain=(v: List<Num>)

GET ColorGrade.saturation → Num

SET ColorGrade.saturation=(v: Num)

GET ColorGrade.name

GET ColorGrade.uniformBytes

GET ColorGrade.uniformWgsl

GET ColorGrade.fragmentBody

FN ColorGrade.writeUniforms(scratch)

CL ChromaticAberration

NEW ChromaticAberration.new(opts: Map)

NEW ChromaticAberration.new()

GET ChromaticAberration.strength → Num

SET ChromaticAberration.strength=(v: Num)

GET ChromaticAberration.falloff → Num

SET ChromaticAberration.falloff=(v: Num)

GET ChromaticAberration.name

GET ChromaticAberration.uniformBytes

GET ChromaticAberration.uniformWgsl

GET ChromaticAberration.fragmentBody

FN ChromaticAberration.writeUniforms(scratch)

MOD outline

CL OutlinePass

NEW OutlinePass.new(device: Device, opts: Map)

NEW OutlinePass.new(device)

GET OutlinePass.name

GET OutlinePass.depthThreshold → Num

SET OutlinePass.depthThreshold=(v: Num)

GET OutlinePass.normalThreshold → Num

SET OutlinePass.normalThreshold=(v: Num)

GET OutlinePass.color → List

SET OutlinePass.color=(v: List)

GET OutlinePass.thickness → Num

SET OutlinePass.thickness=(v: Num)

GET OutlinePass.fovDeg → Num

SET OutlinePass.fovDeg=(v: Num)

GET OutlinePass.fadeNear → Num

SET OutlinePass.fadeNear=(v: Num)

GET OutlinePass.fadeFar → Num

SET OutlinePass.fadeFar=(v: Num)

FN OutlinePass.init_(device, opts)

FN OutlinePass.onAdded_(orchestrator)

FN OutlinePass.dispatchStep_(orchestrator, encoder, ctx)

FN OutlinePass.static FRAGMENT_WGSL_