# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ecalstudios.gitbook.io/screenshot-studio/documentation/changelog.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
