Links
Tags
Creators
Details
Licensed MIT
Published 2 months ago
Updated 3 days ago
All versions
2.5.0
Release
VFXWeaver API 2.5.0 (26.2)3 days ago 48
Compatibility
Minecraft: Java Edition
26.2
Platform
Fabric
Supported environments
Client-side
Client and server
Changes
Added
hex_grid: a triangular grid coloured by the screen position. A new screen effect draws a triangular lattice over the frame - three line directions (two at 60 degrees, one vertical) on acell_sizecell (46 px by default) anchored at the screen centre - and paints the lines with the prism ramp picked by the position (prism7(x * 0.6 + y * 0.4 + time * speed), drifting at 0.5 per second): the lines at 28 % of that colour over near-black(0.01, 0.008, 0.02), and the highlights of the picture (brighter thancore, 0.68 by default - absolute, not local, so no outline appears at a brightness step) in white;amountcross-fades the whole look (default1.0, neutral0.0sofade_ticksfades it) and no param has an upper cap - only the lower guards that avoid degenerate maths (cell_size >= 1px,width >= 0.0001). Additive: one new effect type and its params, no existing datapack field renamed, no UBO layout change,PROTOCOL_VERSIONunchanged. Documented in the guide. Asserted byscripts/check-vfx-schema.ps1,scripts/check-shader-identifiers.ps1andscripts/check-builtins-parse.ps1; the GLSL/pixels cannot be verified headless here. Not verified in game.spectral: a rainbow prism look over the frame. A new screen effect draws the picture through a seven-stop prism ramp - red(1.0, 0.07, 0.1), orange(1.0, 0.42, 0.03), yellow(1.0, 0.88, 0.06), green(0.1, 0.95, 0.28), blue(0.06, 0.48, 1.0), violet(0.28, 0.14, 1.0), magenta(0.74, 0.16, 1.0)- swept by the angle aroundcenter_x/center_y, the distance from it (0.9 per screen height) and the clock (0.7 per second);modepicks the variant: 0 the prism duotone (the frame is split into a dark and a bright half by its own brightness,mid0.5 by default - absolute, not local, so no outline appears at a brightness step; the bright half takes the prism colour and the highlights,core0.68, go white), 1 the chromatic smear (seven taps along the outward direction, spread by0.0035 + 0.004 * distance, every tap's edgesmoothstep(0.02, 0.30)painted with its own prism stop - a wide ramp, so it stays a smear and not a drawn outline) and 2 the spectral ring (the luminance picks a bandfloor(luma * 6.999), the distance picks a ringfloor(distance * 9 - time * 6), the two together pick a spectral stop and the highlights (core0.68) go white;amountcross-fades the whole look (default1.0, neutral0.0sofade_ticksfades it),modeis an enum clamped to 0..2 and no other param has an upper cap. Additive: one new effect type and its params, no existing datapack field renamed, no UBO layout change,PROTOCOL_VERSIONunchanged. Documented in the guide. Asserted byscripts/check-vfx-schema.ps1,scripts/check-shader-identifiers.ps1andscripts/check-builtins-parse.ps1; the GLSL/pixels cannot be verified headless here. Not verified in game.torn_edge: a ragged tear with a glowing line down it. A new screen effect cuts the frame along a straight line throughcenter_x/center_ywhose angle is re-rolled every beat (speed, 20 per second by default): a value-noise ripple ofragged(0.02 of the screen height, 38 cycles across the tear) makes the edge wander, the two sides of the cut are drawn at opposite brightness (a pixel brighter thanmid, 0.5 by default - the split is absolute, not local, so no outline appears at a brightness step), and the tear itself is a white line (an exponential falloff ofglow, 0.0035 of the screen height, scaled by 1.6);amountcross-fades the whole look (default1.0, neutral0.0sofade_ticksfades it), and no param has an upper cap - only the lower guards that avoid degenerate maths (speed >= 0,glow >= 0.0005). Additive: one new effect type and its params, no existing datapack field renamed, no UBO layout change,PROTOCOL_VERSIONunchanged. Documented in the guide. Asserted byscripts/check-vfx-schema.ps1,scripts/check-shader-identifiers.ps1andscripts/check-builtins-parse.ps1; the GLSL/pixels cannot be verified headless here. Not verified in game.datamosh: the frame is decoded against a reference that never arrives, and the movement search runs once per cell instead of once per pixel. A new screen effect is a feedback effect: it keeps the picture it produced last frame in the frame's history buffer, and that history is the reference the decoder gets instead of a key frame. The key frame never arrives: the history only refreshes through the per-piece I-frame below, so the decoder keeps painting the screen as it was half a second ago. The movement is estimated the way a codec searches its reference frame for the matching block: one Lucas-Kanade step between the live picture and the reference (the reference carries the previous live frame's luma in its alpha) gives the velocity of the content, and a greedy search over 8, 4, 2 and 1 pixel finds the integer vector that best matches it, with a penalty that gives exactly zero where nothing moves. The search used to run per pixel (about 174 texture reads per pixel, a full-resolution pass the frame rate could not afford): every pixel of a piece needs the same vector, so the search now runs in its own pass at 1/8 resolution - one texel per 8x8 cell - and the update pass reads the result back. The picture is unchanged, the cost is about 6.5 reads per pixel instead of 174. The decoder then carries the pixels over as they are (point sampled, no filter, no leftover of the live frame), so a moving object drags sharp pixels of the old background with it; the luma is taken at the measured vector and the colour at1 + chromatimes it, the way a 4:2:0 stream smears colour when it is decoded against the wrong reference - every colour is the picture's own, there is no random noise. The pieces come from a static hash quadtree (8 to 64 px), so neighbouring pieces differ in size and the layout never changes, and each piece returns to the real picture on its own phase everyiframeseconds, so there is no global flash.smear(1) is the vector multiplier andchroma(0.5) the colour pull; only the lower guards exist (chromaandamountclamped to 0..1,smearandiframenot negative), no param has an upper cap. Additive: one new effect type and its params, no existing datapack field renamed, no UBO layout change,PROTOCOL_VERSIONunchanged. Honest limits, stated on the page: the melt lives in the same history buffer asafterimage, so the two chain when both run and each overwrites the alpha the other needs; the reference is the screen's own past rather than another shot; the movement needs some structure in the picture, so in flat areas (sky, a plain wall) nothing is dragged; and the motion field is one texel per 8x8 cell, so a slower movement than 8 px is not resolved. Documented in the guide. Asserted byscripts/check-vfx-schema.ps1,scripts/check-shader-identifiers.ps1,scripts/check-post-fusion.ps1andscripts/check-builtins-parse.ps1; the GLSL/pixels cannot be verified headless here. Not verified in game.heartbeat: a heartbeat positioned in the world. A new audio effect plays a recording of one lub-dub that ships inside the mod (ratebeat rate in bpm, default60;volumelinear gain0..1, neutral0.0sofade_ticksfades it;pitchplayback-speed multiplier, default1= as recorded) straight into the OS mixer — no resource pack needed, identical on every Minecraft line. Every beat restarts the recording, and the recording is time-scaled to the tempo: at 60 bpm it plays as recorded (0.85 s in a 1 s beat) and at 140 bpm it is compressed to about 0.36 s in a 0.43 s beat, with the pause inside the lub-dub closing up in the same proportion. The scaling keeps the tone where it was, so a fast heart is a fast recording on the same pitch rather than a higher one;pitchis a separate tone multiplier that does move the pitch; the pause between beats is whatever the recording leaves free, not a separate re-timing. A cut playback is faded over 5 ms so a restart never clicks, andrateandpitchare read fresh every tick, so keyframes/expr/bindings ride them live and the phase integrates per sample, so a rate change glides. Positioning, distance falloff (full within 8 blocks, silent past 48), clock semantics (pause freezes, seek resyncs silently), fade-out on single stop and immediatestopAll/world exit/client shutdown close all mirror thehum/noisevoices; the same honest limits apply (vanilla mixer bypassed, no-audio-device stays silent with a one-time warning). Additive: one new effect type and its params, no existing datapack field renamed, no UBO layout change,PROTOCOL_VERSIONunchanged, no new dependency. Documented in the guide. Asserted byscripts/check-vfx-schema.ps1andscripts/check-builtins-parse.ps1; audible output cannot be verified headless here. Not verified in game.volume_duck: scale a vanilla sound category down while active. A new global (non-positional) audio effect sets one game-options category level to its pre-duck level timesvolume(0..1, neutral1.0sofade_ticksfades the duck in and out), selected by thechannelparam as a case-insensitive name (master,music,records,weather,blocks,hostile,neutral,players,ambient,voice,ui) or the historicalSoundSourceordinal (0..10, back-compat); an unknown name warns once and safely no-ops instead of ducking the wrong category. Each frame only ducked channels are written (base x last-writer-wins scale across stacked ducks); the captured level is restored the frame a channel's last duck ends and on single stop, replay seek,stopAll, world exit and client shutdown, and nothing is ever written tooptions.txt. Honest limits, stated on the page: the options slider shows the scaled level and a mid-duck slider drag on that channel is overwritten, then lost on restore. Additive: one new effect type and its params, no existing datapack field renamed, no UBO layout change,PROTOCOL_VERSIONunchanged, no new dependency. Documented in the guide. Asserted byscripts/check-vfx-schema.ps1andscripts/check-builtins-parse.ps1; audible output cannot be verified headless here. Not verified in game.noise: generated white noise positioned in the world. A new audio effect synthesises mono white noise per effect instance (volumelinear gain0..1, neutral0.0sofade_ticksfades it;brightnesscrisp/soft blend0..1, default0.5;jitterrandom-walk step withjitter_ratespeed multiplier for a playback-rate and volume wander;seedreseeds the texture) straight into the OS mixer — no audio file in any pack, identical on every Minecraft line. Positioning, distance falloff (full within 8 blocks, silent past 48), clock semantics (pause freezes, seek resyncs silently), fade-out on single stop and immediatestopAll/world exit/client shutdown close all mirror thehumvoice; the same honest limits apply (vanilla mixer bypassed, no-audio-device stays silent with a one-time warning). Additive: one new effect type and its params, no existing datapack field renamed, no UBO layout change,PROTOCOL_VERSIONunchanged, no new dependency. Documented in the guide. Asserted byscripts/check-vfx-schema.ps1andscripts/check-builtins-parse.ps1; audible output cannot be verified headless here. Not verified in game.hum: a generated sine hum positioned in the world. A new audio effect synthesises a mono sine tone per effect instance (frequencyin Hz, default440;volumelinear gain0..1, neutral0.0sofade_ticksfades it) straight into the OS mixer — no audio file in any pack, identical on every Minecraft line. The voice is positioned like a world overlay (move position, first staticpositionsentry, first entity anchor, authoredpos_x/y/z, else the local-player snapshot) with a linear distance falloff (full within 8 blocks, silent past 48); it follows the shared effect clock, so pause freezes it and a replay seek resyncs silently. Stopping one instance fades it out;stopAll/world exit/client shutdown closes the voices at once. Honest limits, stated on the page: the vanilla mixer is bypassed (volume sliders do not apply — usevolume), and a machine with no audio device stays silent with a one-time warning. Additive: one new effect type and its params, no existing datapack field renamed, no UBO layout change,PROTOCOL_VERSIONunchanged, no new dependency. Documented in the guide. Asserted byscripts/check-vfx-schema.ps1andscripts/check-builtins-parse.ps1; audible output cannot be verified headless here. Not verified in game.
Fixed
- The frame rate no longer reaches the sound: the voices moved to their own audio thread. The
hum,noiseandheartbeatvoices were synthesised on the render thread, one chunk per frame, so the frame rate leaked into the sound: the gain ramps were one frame long, a long frame could starve the line's buffer (that is the crackling), and the heartbeat's time-scale work spiked the frame. The voices now live on a dedicated audio thread that generates fixed 5 ms blocks from its own wall clock and keeps every line about 60 ms ahead of its playhead, so a slow frame, a lost frame or an unfocused window cannot starve a line or stretch a ramp - the sound is the same at 30 fps and at 200 fps. The render thread only publishes the parameters and the shared effect clock; the voice state belongs to the audio thread, so there is nothing to lock. A paused game (or a paused replay) is still the one thing that stops it: the shared effect clock freezes and the thread renders silence until it moves again. The heartbeat's time-scale work moved to the audio thread with the rest. No param renamed, no wire, UBO or API change,PROTOCOL_VERSIONunchanged. Documented on the hum, noise and heartbeat pages. Not verified in game. - The synthesised voices no longer crackle, and a heartbeat plays out instead of being cut. Three click sources are gone. A voice that resumes after a silence gap (a pause, a game hitch, a fade) now fades in over 5 ms instead of starting at full amplitude. A voice whose effect ended is no longer cut at the playhead: the
humand thenoisefade out and their line is released once it has drained, so the stop is a fade and not a step. And the last 5 ms of a heartbeat recording fade out, so a beat ends without a click. The heartbeat'sdurationnow decides when the sound stops repeating: when the instance ends, the thump stops repeating right there and the beat that is sounding plays to its end instead of being cut in the middle. No param renamed, no wire, UBO or API change,PROTOCOL_VERSIONunchanged. Documented on the heartbeat page. Not verified in game. - Synthesised voices no longer stutter or crackle on slow frames. The
hum/noise/heartbeatvoices counted samples from frame ticks, so an unfocused window (a few frames per second) pushed each frame past the 4-tick cap and the voice emitted nothing (chunk-gap-chunk), and the 0.25 s line buffer underran whenever the game loop stalled. Each voice now counts samples on its own steady wall clock gated by the effect clock: slow frames and replay seeks emit the wall-clock debt sized to the line's free buffer space (the write never blocks the frame), phases stay continuous so there are no bursts or boundary clicks, and pause (or a paused replay) still freezes synthesis exactly as before. The buffer grows to 0.5 s. No param renamed, no UBO or wire change,PROTOCOL_VERSIONunchanged. Documented on the hum, noise and heartbeat pages; audible output cannot be verified headless here. Not verified in game. - Local-contrast halos around geometry in
halftone,comicandaccent_glow— local averaging removed. The 8-tap averaging ring made the tone mapping a de-facto edge detector: near any luminance step the local mean skewed and the tone saturated into flat paper-coloured bands with no dots, which reads as glowing outlines and is useless for halftones. All three effects now map absolute pixel luminance instead (halftonekeeps its adjustablegaincontrast around mid grey, default2.5= neutral;comicgains a tunablemidsplit point, default0.5;accent_glowgains tunablemid/corethresholds, defaults0.5/0.68), so halos cannot form by construction — plus 8 fewer texture fetches per pixel. Dot grids grow from the screen centre instead of a corner, so changingcell_sizerescales around the middle of the frame. Three new optional params (midoncomic;mid,coreonaccent_glow), no UBO or wire change,PROTOCOL_VERSIONunchanged. Not verified in game.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:HBhB8m4j:52VEfOyc"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:HBhB8m4j:52VEfOyc"
}

