Skip to content

GIF (animated) export

The GIF engine exports an animated asset as a single looping .gif file. Asset-scope only (free). Animated mode is auto- selected for multi-frame assets and the per-frame durations encode directly into the GIF’s frame timing.

Useful for:

  • Sharing an animation on Discord, Twitter, Slack, or anywhere with a chat input - GIF renders natively in every messaging platform without uploads or conversions
  • Embedding in a README, marketing page, or product gallery - every browser plays GIFs without JS, so no video player required
  • Sending a quick “is this moving right?” preview to a collaborator who doesn’t have Hexcalibur

A single file named <asset-slug>.gif. The GIF loops infinitely by default (no end marker, browsers cycle).

The Frames dropdown picks which frames go into the output:

  • All frames - every frame in source order. The default.
  • Active tag (only shown when the asset has at least one tag) - exports just the currently selected tag’s range. The tag’s direction (forward, reverse, ping-pong) bakes into the output.
  • Custom range - explicit from and to frame indices in the inputs below.

For multi-tag assets, the dialog also surfaces a dedicated Export per tag button that emits one GIF per tag, bundled into a single .zip named <asset>-by-tag.zip (each file is <asset>-<tag-name>.gif). This shortcut is GIF-and-APNG-only - other animated formats (sprite-sheet) keep everything in one file with tag metadata embedded in the manifest.

GIFs display at the pixel size encoded into the file. Browsers and chat apps almost always render them with bilinear filtering, which makes a 16×16 source look blurry at any larger viewer size. The dialog offers nearest-neighbor upscaling so the output stays crisp at social-media display sizes:

  • 1x (native) - exports at the asset’s canvas size. Smallest file but blurry in most viewers.
  • 2x / 4x / 8x / 16x / 32x - upscale by the chosen integer factor before encoding. Always nearest-neighbor (no bilinear), so hard pixel edges stay sharp.

The default picks the smallest scale that brings the output to at least 128 px - a 16×16 source defaults to 8x, a 32×32 to 4x, a 64×64 to 2x, and anything 128 px or larger stays 1x.

The dialog defaults to the asset’s per-frame durations baked in at paint time. The FPS override field lets you flatten every frame to a uniform rate without rewriting the per-frame durations in the editor:

  • Empty (default) - use the per-frame durations from the timeline.
  • Any positive number - every frame in the GIF holds for 1000 / fps ms.

Useful for one-off “what if this played twice as fast?” exports without permanently changing the asset.

GIF is limited to 256 colors per frame (palette-indexed). If your animation has more than 256 colors, the encoder picks a representative palette and quantizes - which can introduce banding on smooth gradients or semi-transparent overlays.

For animations that need lossless color (high color counts, soft alpha, screen / overlay blend modes between frames), use APNG instead.

Layers composite to a flat frame before encoding. To export individual layers, use the per-layer export engine on a single frame and stitch in a separate tool.

For block-texture assets in mirror mode, the output is the shared composite. In face-independent mode, the output is the currently active face - switch faces in the editor and re-export to get other faces.

  • Multi-asset packs. Pack-scope export is intentionally not available for GIF (there’s no useful “all assets as one animation” output). Use Sprite sheet for engine- ready animation atlases or Generic atlas for static multi-asset bundles.
  • Lossless color. See APNG above.
  • Frame-tag metadata in code. Sprite-sheet exports the tag ranges as JSON; GIF has no equivalent metadata. Use sprite- sheet when your engine needs to play tagged ranges by name.