Skip to content

Changelog

Version 1.2.0

Premium UI/UX Refresh

Every tab has been redesigned from scratch using a shared design system defined in SSStyle.h. The interface moves from a flat dark layout to a structured, premium editor tool feel with consistent spacing, panel hierarchy, and color roles.

The new design system defines spacing tokens (XS=4, SM=8, MD=12, LG=16, XL=24, XXL=32), a named color palette using correct sRGB to linear conversion, and reusable widget factories: PageHeader, StatusBanner, TipsPanel, FormRow, and Separator.

Each tab now has a page header with a title and description. The Capture tab shows a live session summary in the header (format, output folder, prefix, capture count). Preset rows are 62px card height with accent-colored dimensions and a white capture button. The sub-tab bar uses accent text for the active tab.

The Steam Pack tab shows assets grouped by category (Store, Library, Community, Events) in a proper table with alternating row backgrounds. Batch, GIF, and Video tabs have their settings organized into panels with FormRow inputs, color-coded status banners (idle/recording/encoding/complete), and tips sections. The Settings tab is split into four clear panels: Output, Format and Quality, Watermark, and Behavior. JPG Quality is hidden when PNG or EXR is selected. Watermark controls are dimmed when the watermark is disabled. The Files tab has a header with session count, a proper table with Open buttons per row, and an intentional empty state.


Capture Source Selection (Auto, Editor Viewport, PIE Viewport)

A three-button Capture Source toggle now sits in the Capture tab between the page header and the preset sub-tabs. It controls which viewport is used for all captures including single presets and Steam Pack generation.

Auto is the default and the recommended setting. When Play mode is active it uses the PIE viewport; otherwise it uses the editor viewport. The toggle shows a live status text on the right so you always know which source is active.

Editor Viewport always captures the clean editor scene with no game HUD or overlays. It works even when the game is not running.

PIE Viewport always captures the live gameplay frame. It requires an active PIE session and shows an amber warning banner if you try to capture without Play mode running.

PIE capture uses FSlateApplication::TakeScreenshot() on the game window after full Slate compositing, then crops to just the game viewport area and bilinear-scales to the requested output size. This is the only method that includes screen-space UMG, CommonUI, and HUD overlays. ReadPixels was tried first but only reads the 3D render target with no UMG. The HighResShot exec command was also tried but it ignores FilenameOverride and saves to Unreal's default screenshot folder regardless of settings.


GIF Recorder: Capture UI Toggle

A Capture UI checkbox appears in the GIF settings panel next to Dithering and Loop (default: on).

When on, each frame is captured via FSlateApplication::TakeScreenshot() on the game window, cropped to the game viewport, and downsampled to the GIF resolution. Screen-space UMG, CommonUI, and HUD are included.

When off, each frame is captured via FViewport::ReadPixels() on the 3D render target. No UI overlays. The alpha channel is forced to 255 after reading since the PIE viewport renders with A=0.


Video Recorder: Capture UI Toggle and Vertical Flip Fix

A Capture UI checkbox appears in the Video tab below the format selector (default: on), with the same behavior as the GIF toggle.

The ReadPixels path previously produced upside-down video in the FFmpeg encoder. This happened because ReadPixels() returns pixels in bottom-up order (DirectX convention) and no flip was applied before saving PNG frames. The fix normalizes all captured frames to top-down in CaptureFrame() before scaling and encoding, regardless of the encoder used. The Windows Media Foundation path still writes bottom-up to the MF DIB buffer because MF expects that format, but this is now a deliberate conversion rather than an accidental workaround.


Steam Pack: Numbered Folders

Steam Pack now creates a new numbered subfolder on every run: SteamPack_001, SteamPack_002, and so on. Previous runs are never deleted. This lets you capture multiple times, from different angles or lighting or viewport sources, and compare the results before submitting to Steam. The completion notification names the folder that was just created.

When using the PIE source, the master frame is saved as _master_source.png alongside the 14 derived assets, matching the editor path which saves _master_4K.png.


Enhanced Steam Preview

The Steam Preview tab has been completely rebuilt across seven new source files. All three pages (Store Page, Front Page, Library) now use accurate Steam colors, fixed-width canvases that do not stretch with the plugin window, aspect-ratio locked image slots, procedurally generated fake surrounding content, and a persistent image library that survives editor restarts.

Colors. All pages use exact Steam color tokens: #1B2838 for the page body, #171A21 for the nav bar, #66C0F4 for link blue, #75B022 for CTA green, #A4D007 for discount yellow, and layered dark blue panels in between. The previous flat black background is gone.

Fixed canvas. MakeCanvas() wraps each page at a fixed design width (908px for Store, 816px for Front Page) inside a centered, scrollable container. Resizing the plugin window has no effect on the content layout.

Aspect-ratio locked slots. Every image slot is a fixed pixel rectangle with SBox::WidthOverride, HeightOverride, and EWidgetClipping::ClipToBounds. Images are center crop-to-fill scaled. Nothing distorts regardless of the source image dimensions or window size.

Procedural fake content. FSSFakeContentGenerator generates 24 surrounding fake games from a seed. Same seed always produces the same titles, descriptions, tags, colors, and prices. Text pools cover prefixes, nouns, subtitles, developers, publishers, description sentences, review summaries, release dates, and genre tags. An optional Fab review prompt can be appended to the featured game's description and news card.

Procedural cover art. SSSFakeCoverWidget is a pure SLeafWidget that draws game cover art entirely via FSlateDrawElement with no UTexture2D, no UObject, and nothing in the content browser. Each cover has six layers: a near-black cinematic base with a color bloom from the bottom, diagonal light streaks and genre-specific overlays, a radial glow with a genre-specific silhouette icon (sword, skull, shield, planet, compass, crosshair, or crystal), a gradient caption band with bold title and tag text, a discount badge and price display, and a multi-pass vignette on all four edges.

Persistent image library. Every capture is automatically registered in Saved/ScreenshotStudio/ImageLibrary.json. The library loads on plugin startup and rescans the output folder for any files added externally. Slot assignments (which captured image appears in which preview position) are also saved and restored after editor restarts. Paths are stored project-relative where possible.

Click-to-assign picker. Clicking any user image slot opens an image picker showing the full capture library. Images are split into Best Matches (within ±60px of the slot's ideal resolution, shown with a green badge at the top of the list) and Other Sizes (dimmed, labelled as "will be cropped to fit"). Every row shows a 96×54 crop-to-fill thumbnail of the actual captured image alongside the filename and dimensions. Selecting any image immediately updates that slot and saves the assignment.

Store Page layout. Breadcrumb nav, white title, 600×337 main screenshot with a thumbnail strip (using your actual captured images, not fake covers), a 280px right info card with header capsule, description, review badge, metadata, and genre tag pills, a purchase bar with discount price block and Add to Cart, About This Game, Recent Updates, and a More Like This card row.

Front Page layout. 616×353 hero carousel with a title strip and a right stack of four smaller generated game thumbnails, carousel dots, then Discounts and Events, Recommended For You, Top Sellers, and New & Trending rows, all populated with procedural fake covers with price and discount badges.

Library Page layout. A fixed 220px left sidebar with a search field, category label, the selected game using your captured library capsule, and 12 surrounding fake game entries with small covers. The main area has the library hero image at a locked 750×243 display (3840:1240 ratio), an Install/Play action bar with metadata (space required, last played, play time), a library header slot, a tab bar, an Available Content row using your actual captured images, an activity/news card, and an achievements progress bar.

User image rows. Two specific areas always use your real captures instead of generated covers: the Store Page thumbnail strip (the four thumbnails below the main screenshot, starting from your second-most-recent capture) and the Library Available Content row. If you have fewer captures than the row needs, remaining slots show a "Capture more" placeholder.

Toolbar. Randomize generates a new seed and rebuilds fake content while preserving any manual slot assignments. Use Latest Set auto-fills all slots from the most recent captures. Refresh reloads images and rebuilds the current page. Show Fab Review Prompt is a checkbox toggle for the promotional text.


Other fixes and changes

WebM encoding previously failed with error -22 because VP9 and VP8 reject RGBA pixel format. Fixed by adding -vf "format=yuv420p" to the FFmpeg command.

FFmpeg detection paths are now always stored as absolute paths so background encoding threads can resolve them correctly regardless of working directory.

FSteamPackEntry gained a Category string field used by the Steam Pack grouped asset table.

The Json and JsonUtilities modules were added to ScreenshotStudio.Build.cs for the image library manifest.

Plugin version updated to 1.2.0 in .uplugin and the status bar.


Version 1.1.0

New Steam Description Video Recorder (MP4 & WebM)

Steam added MP4 and WebM support for store page description embeds in August 2025, replacing GIF as the recommended format. Valve also widened store pages from 940px to 1200px, with the content column expanding from 616px to 780px.

Video Tab

A dedicated tab between GIF and Guides for recording Steam description clips.

  • Records PIE footage via FViewport::ReadPixels(), bilinear-scales to target resolution per frame
  • Format selector: MP4, WebM, or Both — choosing Both encodes both formats from one recording session
  • Four presets: Steam Description SD (780×438 @30fps), HiDPI (1170×658 @30fps), Square (780×780 @30fps), Cinematic (780×438 @24fps)
  • Live status line: idle → green recording counter → amber encoding status
  • Ctrl+Shift+R hotkey extended to cover video: stops video if recording, then GIF if recording, then starts video

Encoding priority (all platforms)

  1. FFmpeg (best quality, supports both MP4 and WebM)
  2. Windows Media Foundation (Windows only, MP4 only, zero install required)
  3. PNG sequence fallback (always works — saves frames + encode.bat / encode.sh)

WebM encoding uses VP9 (libvpx-vp9) with automatic fallback to VP8 (libvpx). Both VP9 and VP8 are accepted by Steam. The pixel format is explicitly converted from RGBA to YUV420p before encoding so VP8/VP9 encoders don't reject the transparent PNG input.

FFmpeg auto-downloader

The Video tab shows a live FFmpeg status indicator (green = found with path, amber = not found). When not found:

  • "Download FFmpeg Automatically" button — downloads from the official gyan.dev Windows build, evermeet.cx (Mac), or John Van Sickle (Linux)
  • Install location: [ProjectDir]/Saved/ScreenshotStudio/FFmpeg/ffmpeg[.exe]
  • Extraction uses platform-native tools: PowerShell Expand-Archive (Windows), unzip (Mac), tar (Linux) — no external tools
  • Refresh button re-detects without restarting the editor
  • FFmpeg paths are always stored as absolute paths so encoding works correctly on background threads

Steam Store Preview updated

Content column width updated from 616px → 780px to match the August 2025 store redesign.

Known Limitations

  • GIF and Video recording require Play-In-Editor (PIE). Record buttons are disabled outside of PIE.
  • Video encoding requires FFmpeg for WebM. Windows builds fall back to the built-in H.264 encoder for MP4 if FFmpeg is absent.
  • Resolution Preview Frame and Composition Guides appear only in Level Editor viewports, not in Material Preview, Blueprint, etc.
  • The project path must not contain spaces (Windows linker limitation).

Version 1.0.0

Initial Release - UE 5.5 · 5.6 · 5.7

Engine Compatibility

Targets UE 5.5, 5.6, and 5.7 exclusively, using the modern FImage-based ImageWrapper API throughout:

  • IImageWrapperModule::CompressImage / DecompressImage + FImage for all image encode/decode
  • SLevelViewport::AddOverlayWidget for editor viewport overlays (replaces UDebugDrawService which only fires in PIE)
  • FSlateApplication::OnApplicationPreInputKeyDownListener for the GIF hotkey (fires before game input during PIE)
  • File-watcher ticker (100ms poll) for capture detection (replaces FHighResScreenshotConfig::OnScreenshotCaptured which was removed in UE5.7)

Capture Tab

  • 7 preset sub-tabs: Standard, Steam Store, Steam Library, Steam Community, Steam Misc, Social Media, Custom
  • Standard resolutions: 720p, 1080p, 1440p, 4K, 8K, Ultrawide, Steam Deck (1280×800)
  • Steam Store: Header Capsule (920×430), Small Capsule (462×174), Main Capsule (1232×706), Vertical Capsule (748×869), Page Background (1438×810), Screenshots 720p/1080p
  • Steam Library: Library Header, Library Hero (3840×1240), Library Logo, Library Capsule (600×900)
  • Steam Community: Community Header, Community Icon, Client Icon
  • Steam Misc: Broadcast, Trailer Thumbnails, About Banners, Event Header/Cover
  • Social Media: Twitter/X, Instagram Square, Instagram Story, Facebook, YouTube, Discord, Reddit
  • Custom resolution with quick aspect-ratio shortcuts (16:9, 21:9, 4:3, 1:1, 9:16)
  • All specs reflect Steam's August 2024 updated requirements
  • Captures detected via file-watcher ticker — notification toast, Gallery update, and Steam Preview refresh all fire correctly in UE5.7

Resolution Preview Frame

  • Slate SLeafWidget added to SLevelViewport via AddOverlayWidget
  • Blue frame border with corner ticks, dimmed outer regions, floating label (resolution + coverage %)
  • Works in all editor viewports without requiring any show flags
  • Toggle per-preset — only one active at a time

Steam Pack

  • Captures 4K master from active editor viewport
  • Generates all 14 Steam assets via center-crop + bilinear resize
  • Saves to SteamPack/ with Steamworks-ready filenames
  • Watermark disabled on master (applied to individual captures only)
  • Folder opens once on completion — never during generation

Batch Tab - Turntable

  • Orbits editor camera around selected actor's bounding box center
  • Configurable: distance, height, frame count, arc, start angle, interval, capture resolution
  • bOpenAfterCapture suppressed during entire batch — folder opens once at the end
  • Camera restored to original position on completion and on cancel

Batch Tab - Burst

  • N shots at timed intervals (2–100 shots, 0.1–10 s)
  • bOpenAfterCapture suppressed during batch — same fix as turntable

Batch Rename & Organize

  • Scans output folder, matches files by pixel dimensions (±2px tolerance)
  • Rename Flat: renames in-place to Steamworks names
  • Rename + Organize: renames and sorts into Store / Library / Community / Events subfolders

GIF Recorder

  • Records PIE footage via FViewport::ReadPixels()
  • Pure C++ GIF89a encoder — zero external dependencies
  • Median-cut color quantization (16M → 256 colors per frame)
  • Optional Floyd-Steinberg dithering
  • LZW compression with variable-width codes
  • Background thread encoding — editor stays responsive
  • Frame Skip halves file size
  • 7 presets: Steam About Section (800×450 @15fps), Steam Large, Small Preview, Medium, Twitter/X, Instagram Square, HD Preview
  • Ctrl+Shift+R hotkey — toggles recording during PIE via OnApplicationPreInputKeyDownListener, fires before game input
  • Hotkey info shown in GIF tab UI with a clear banner above the record buttons

Composition Guides

  • Slate SLeafWidget added to SLevelViewport via AddOverlayWidget
  • Rule of Thirds (3×3 grid + intersection dots), Golden Ratio, Crosshair (center lines + diagonals), Safe Zone (title-safe 90% yellow, action-safe 93% cyan)
  • Works in all editor viewports without show flags
  • Editor-only: never appear in captures

Steam Store Preview

  • Three sub-views: Store Page, Front Page, Library
  • Correct Steam color palette using FLinearColor(FColor(r,g,b)) for proper sRGB→linear conversion:
  • Background: #1b2838, Header: #171a21, Panel: #2a475e, Accent: #1b9af7
  • Text: #c6d4df, Muted: #8ba1b5, Green button: #4c6b22
  • Images loaded via IImageWrapperModule::DecompressImage + FImage, registered as FSlateDynamicImageBrush
  • Image_Lambda with captured TSharedPtr<FSlateDynamicImageBrush> — brush lifetime tied to widget, prevents dangling pointer crash
  • SScaleBox with EStretch::ScaleToFit — images maintain aspect ratio when window is resized
  • Widget tree cleared before brushes are released — eliminates 0xFFFFFFFFFFFFFFFF access violation crash
  • MakeSteamPreviewTab uses Rebuild() (clears children first) instead of RefreshImages() (which destroyed brushes while widgets were still alive)

File List

  • Session capture history up to 200 entries, newest first
  • Filename, dimensions, file size per entry
  • Open button reveals containing folder in Explorer/Finder
  • Clear removes session entries without deleting files

Settings

  • Output folder (relative or absolute), file prefix, timestamp suffix
  • Format: PNG, JPG (quality 1–100), EXR
  • Watermark/Logo Overlay: file browser, position (TL/TR/BL/BR/Center), scale (5–50%), opacity (0–100%)

Editor Integration

  • Tools > Screenshot Studio menu entry
  • Ctrl+Shift+S keyboard shortcut
  • Dockable SDockTab
  • Zero runtime impact — Type: "Editor" module excluded from packaged builds
  • Works with Built-in RP, Forward Shading, Lumen, Path Tracing

Known Limitations

  • GIF recording requires Play-In-Editor (PIE). The Record button is disabled outside of PIE.
  • Resolution Preview Frame and Composition Guides appear only in Level Editor viewports, not in other panel viewports (e.g. Material Preview, Blueprint Viewport).
  • The project path must not contain spaces due to Windows linker response file limitations.