promotional bannermobile promotional banner

CoolCatLib: Canvas

Paint your world with style. Screen effects, custom skies, slick GUI widgets and render tools: the cat's whiskers of visuals. Requires CoolCatLib: Core.
Back to Files

[Fabric] 1.20.1 | V2001.1.0.0 RELEASE

File namecoolcatcanvas-fabric-1.20.1-2001.1.0.0.jar
Uploader
ixDarkLorDixDarkLorD
Uploaded
Sep 30, 2026
Downloads
7
Size
789.2 KB
Mod Loaders
Fabric
File ID
9018841
Type
R
Release
Supported game versions
  • 1.20.1

Curse Maven Snippet

Fabric

modImplementation "curse.maven:coolcatlib-canvas-1716397:9018841"

Learn more about Curse Maven

What's new

v2001.1.0.0 Release | Sep 30, 2026 (Minecraft 1.20.1)

✨ New Features

  • First release: the render and visuals half of what used to be CoolCatLib, split out and built on CoolCatLib: Core. Everything below was moved from CoolCatLib into the net.ixdarklord.coolcatcanvas package and coolcatcanvas namespace.
  • Screen effects (api.client.effect): full-screen post-processing shaders whose uniforms can change every frame (vanilla's post chains bake them in at load).
    • ScreenEffects.register(id, definition) from a vanilla-format post_effect JSON (vanilla's own included) or a ScreenEffectDefinition built in code; any number stack, ordered by priority, drawn over the world (WORLD) or over everything including the HUD and menus (SCREEN).
    • Smooth fades (fade, Easing), timed pulses (enableFor), animated strength, conditions (activeWhen), strength functions of the frame (strength) and per-frame callbacks (onFrame).
    • Uniforms by name: set, animated (animateTo) or bound to a function of the frame; autoBlend fades shaders that ignore the effect's strength.
    • Shaders get Strength, Time, Age and Seed plus noise and luminance helpers from #moj_import <coolcatcanvas:screen_effect.glsl>; persistent targets allow feedback effects; reloaded with resource packs; a failing effect is logged and skipped.
    • No effects of its own: mods bring their own post effect JSON and shaders, or use vanilla's (minecraft:invert, ...).
    • api.effect.ScreenEffectControl drives a player's effects from the server.
    • Layers (ScreenEffects.layers()): the draw order of every effect, from priorities until rearranged (move up/down, to a layer, to the top or bottom, reset).
    • An effects screen (ScreenEffects.openScreen(), a key unbound by default, /coolcatcanvas_client effects): every selectable effect with a switch, the active ones as drag-and-drop layers grouped by stage with a strength slider each, a live unblurred preview and a Preview mode hiding the panels. Players' choices (on/off, strengths, order) are saved to config/coolcatcanvas-screen-effects.json. Effects have a displayName, description and selectable flag for it.
    • Events (ScreenEffectEvents): BEFORE_TOGGLE (cancellable) and TOGGLED with the cause (code, condition, timeout, player, server), STRENGTH_CHANGED, UNIFORM_CHANGED, LAYERS_CHANGED and LOADED.
  • Custom skyboxes (api.client.sky): layers drawn inside vanilla's sky pass, around the sun, moon and stars.
    • Skyboxes.register(id, definition) from a SkyboxDefinition built in code or assets/<namespace>/skybox/<path>.json; resource packs add skyboxes with no code by listing dimensions (dimensions without a sky, like the Nether, get one while it shows).
    • Layer types: cubemap (six faces in a 3x2 image), panorama (equirectangular), sprite (an image placed in the sky, e.g. a planet), gradient, and shader (your own fragment shader, with #moj_import <coolcatcanvas:sky.glsl>); any type can swap in its own fragment shader.
    • Per layer: blend mode (alpha, additive, multiply, screen), tint, orientation, rotation over real time, game time, the day or vanilla's sun/moon/star angle, flipbook animation with optional interpolation, day-time fade windows, rain fade, horizon/underwater fog, and 4 shader params.
    • Hides vanilla's sky color, sunrise, sun, moon, stars, void, End sky and End flashes, fading them out as the skybox fades in.
    • Runtime control: fades, enableFor, conditions (activeWhen), per-frame callbacks, and per layer (Skybox.layer(name)) visibility, animated opacity and tint, and params set, animated or bound to a function of the frame. api.sky.SkyboxControl drives them from the server: enable, disable, toggle, setEnabled, timed pulses and layer changes, for one player or several (to(players), inLevel(level), everyone(server)).
    • Cheap: nothing runs while no skybox shows; a visible layer is one draw from a shared static mesh, all layers of a stage share one render pass and one uniform upload.
  • api.utils.Easing: easing curves.
  • GUI components and widgets (api.client.gui.components: panels, scroll and drag widgets, slide animations, ColorableImageButton), and api.client.utils RenderUtils, NineSliceInfo and ScreenAnchor.
    • ViewportPanel (pan and zoom) edge fades show where content continues past an edge, and shrink smoothly into their side as the end of the content on that side comes into view.
  • Animated color gradients (api.utils.ColorGradient): color stops looping around (ColorGradient.of(colors...)) or the full rainbow (RAINBOW, rainbow(saturation, brightness)), scrolling over time (withSpeed) and along the text or outline (withSpread), with each letter colored (perLetter(n)) or the whole text in one cycling color (wholeText(), RAINBOW_WHOLE). Presets: RAINBOW, RAINBOW_WHOLE, PASTEL_RAINBOW, FIRE, OCEAN, AURORA.
  • Gradient components: gradient.literal("..."), gradient.apply(component) or a style with gradient.textColor() make a component animate wherever it's drawn (chat, tooltips, item names, signs, widget labels). In JSON text and commands (/tellraw) the color is "coolcatcanvas:rainbow", "coolcatcanvas:rainbow_whole", "coolcatcanvas:rainbow/<speed>/<spread>/<saturation>/<brightness>" or "coolcatcanvas:gradient/<speed>/<spread>/#RRGGBB/#RRGGBB..."; players without Canvas can't read it.
  • Gradient and outlined text (api.client.utils.TextEffects): gradient(text, gradient) and rainbow(text) recolor existing text and stay animated when kept; outlined text in a solid color or a gradient.
  • Outlines (api.client.utils.Outline): solid or a gradient (Outline.gradient, Outline.rainbow()), with a thickness and padding, drawn around any rectangle; ElementOutlines.set(widget, outline[, when]) attaches one to any widget (vanilla's too), optionally only while a condition holds (hovered, focused...).

🔁 Differences from the 26.1.2 version (Minecraft 1.20.1)

  • Built for Forge 47 and Fabric on Java 17. Screen effects and skyboxes run on 1.20.1's OpenGL rendering with Canvas's own shader programs (GLSL 150, no uniform blocks, #moj_import supported), hooked into GameRenderer.render and LevelRenderer.renderSky on both loaders.
  • Screen effects use 1.20.1's post chain format: definitions are assets/<ns>/shaders/post/<path>.json (vanilla's own included, e.g. minecraft:invert) with programs in shaders/program/. ScreenEffectDefinition is (targets, passes); a Pass has program, input, output, auxTargets, uniforms and bilinear (JSON name, intarget, outtarget, auxtargets, uniforms, bilinear); uniform types come from the program JSON (UniformSpec(name, values)); the main input sampler is DiffuseSampler. simple(program, uniforms...), PassBuilder.input(sampler, target) takes the full sampler name, and PassBuilder.bilinear/uniform are new; every target persists between frames. BLIT_PROGRAM and BUILTIN_UNIFORMS replace the 26.1.2 shader-stage constants.
  • Skyboxes: SkyBlend exposes sourceColor()/destColor()/sourceAlpha()/destAlpha()/apply(). 1.20.1 has no End flashes (VanillaSky.END_FLASH does nothing) and its moon and stars follow the sun, so the moon and star clocks do too. In dimensions with a sky renderer of their own (Forge DimensionSpecialEffects.renderSky, Fabric API DimensionRenderingRegistry), the layers are drawn over that sky, in the sky's fog; what a skybox hides only applies to vanilla's sky, so nothing of that sky is hidden. With an Iris/Oculus shader pack active, skyboxes step aside.
  • GUI widgets: render methods named extract... on 26.1.2 are render... (Panel.renderContents, ScrollPanel.renderScrolled/renderFrame, ViewportPanel.renderWorld/renderViewBackground/renderViewForeground); input uses 1.20.1's signatures (ViewportPanel.worldClicked(x, y, int button)); widgets take Canvas's own WidgetSprites (texture paths, stretched or nine-sliced); AbstractScrollableWidget scrolls sideways with Shift + wheel. RenderUtils adds containsPoint, nextStratum, withTint and blitSprite.