Source 2 Viewer v19.1
A thumbnail grid for browsing files with live previews, support for more light types in maps, and faster rendering of large maps.
Thumbnail Grid View
The file explorer now supports a thumbnail grid view with live-rendered previews of models, materials, and textures. Toggle between list and grid layouts, and resize thumbnails with Ctrl+Mouse wheel or the slider. Thumbnails are rendered on a background thread using the full OpenGL pipeline.

Barn and Omni Light Support
Added rendering of barn (cone-shaped) and omni2 (point) lights. Barn lights support perspective and orthographic projection, cookie textures, soft edge falloff, and dynamic shadows.
| Before | After |
|---|---|
![]() |
![]() |
GPU-Driven Culling
Scene rendering now uses a GPU-driven culling pipeline. A compute shader tests every meshlet AABB against the camera frustum, a hierarchical depth pyramid
(occlusion culling), and a screen-size threshold. This reduces draw overhead in large scenes. Meshlet level culling is available on most Source 2 maps built 2023 and forward.
World visiblity (vvis)
Added support for parsing .vvis files and visualizing the clusters.

AnimGraph 2 Clip Playback
AG2 animation clips can now be played back directly in the model viewer. Clips are loaded from referenced .vnmclip files, organized by folder name alongside AG1 animations.
Improved AG1 Decompilation
Decompilation of AnimGraph 1 state machines now covers 35+ node types. State machine condition scripts, virtual parameters, and proper node connection mapping are also supported.
GUI
- When opening another file from disk, it will open in an exiting S2V instance
- Added thumbnail previews to package explorer
- Added Ctrl+Mouse wheel to change grid size, persisted across sessions
- Added SVG save button, saves at current zoom level
- Added bitmap save button for image resources
- Added controls grouping in renderer sidebar (Render, Model, Camera, Debug sections)
- Added detailed per-pass render timing viewer option
- Added searching for tools asset info data in package viewer
- Added syntax highlighting for TypeScript files, XML highlighting for vsvg
- Added mouse sensitivity option that matches source engine behavior
- Added particle operator list display in the particle viewer
- Added meshlet, skinning, and VBIB VRAM stats to model viewer
- Added Discord link to the About window
- Improved syntax highlighting KeyValues based on actual tokens instead of regexes
- Improved UV tiling toggle smoothness in the texture viewer
- Enabled automatic update checks by default
- Changed model viewer to show tools materials by default
- Changed shadow resolution option to a shadow quality option
- Changed to apply VSync and FOV settings immediately when switching to GL tab
- Changed to allow orbiting in walk mode
- Changed to start scanning game directories in parallel before main window loads
- Changed file explorer to persist across tab switches instead of being recreated
- Changed input handling to accumulate keys so they are not lost at low frame rates
- Fixed shadow setting not being saved
- Fixed preview resource being disposed too early
- Fixed UI and event memory leaks
- Fixed animgraph viewer crashes
- Fixed texture viewer stealing focus and not respecting max texture size
- Fixed image viewer crash when opening Gray8 PNG files
- Fixed image viewer alpha premultiplication by forcing the alpha codec to unpremultiplied
- Known issues:
- Application hangs when capturing screenshot with Ctrl+C. (Fixed in dev build)
Renderer
- Added GPU-driven frustum, occlusion, and size culling via compute shaders with multidraw indirect
- Added barn (cone) and omni2 (point) light rendering with shadow atlas
- Added compute shader MSAA and depth resolve (replacing blit operations)
- Skipped outline rendering overhead when nothing is selected
- Added "Tool Entities" world layer for triggers, nav meshes, etc.
- Added world layer for entities disabled by default (e.g. CS2 Wingman spawns)
- Added support for particle snapshots
- Added particle light rendering using omni2 lights
- Added more particle operators and initializers, with child systems inheriting control points from parent
- Added RGBM6 texture decoding to the GPU decoder and texture viewer
- Added rendering of backfaces into shadow maps
- Added world visibility cluster visualization
- Separated vr_standard into its own shader, distinct from complex
- Implemented csgo_simple_3layer_parallax shader with parallax-mapped triple layer blending
- Standardized diffuse lobe formula to match Counter-Strike 2 (pure Lambert)
- Improved fog entity to only copy rotation from env_sky
- Improved rendering of SteamVR maps (foliage, cubemaps, sun shadows in v1 lightmaps)
- Improved particle model preview
- Changed world loader methods to public for granular loading control
- Fixed IBL color space when LDR based compression is used.
- Added ability for materials to customize texture address mode (UV Wrap, Repeat)
- Fixed alpha test to properly utilize alpha-to-coverage
- Fixed YCoCg skybox rendering
- Fixed csgo_environment blend color correction and detail overlay
- Fixed csgo_environment metalness default value
- Fixed set by feature not handling (not) equal constraint types in VFX evaluation
- Fixed missing scene object skins
- Fixed crash when crouching with no physics present
- Fixed AG2 additive animations not displaying anything
- Fixed swapped axis in text renderer
CLI
- Added nav mesh file export to glTF
- Removed [archive index] log line when dumping
Library
BREAKING: KV3TextSerializer, KeyValues3, KVObject, KVValue have been removed from this library.
KV3 parsing is now powered by ValveKeyValue.
BREAKING: Entity now extends KVObject from ValveKeyValue, and Entity.GetPropertyUnchecked has been removed.
- Improved AnimGraph 1 node decompilations
- Added AnimGraph 2 clip playback on models
- Added world visibility (vvis) support
- Added full equirectangular projection for decompiled cubemap textures
- Added export of NmSkeletonRefs, Animgraph2Refs, and CitadelEventIDToBodyGroupMapping_t
- Added vpcf65 to KV3 ID lookup
- Added enabled combo comment to SPIR-V reflection output
- Added shader source files to parsed VFX data
- Added new ObjectTypeFlags values
- Added new AnimGraph node fields
- Added default value parameter to KVObject property getters
- Named all VfxEval opcodes
- Changed Texture.Reflectivity from float[] to Vector4
- Changed LineSceneNode to public
- Changed
MurmurHash2.Hashto be case-insensitive, withHashCaseSensitiveadded for the previous behavior - Added
MurmurHash2.Hashversion that accepts a singleuint - Added normal and additive blending methods to FrameBone (CTransform in Source2)
- Improved shader combo constraint solver
- Fixed UV mapping on decals in glTF exports
- Fixed
GetUnsignedIntegerPropertyon negative integers (e.g. SteamVR Homem_nDefaultMeshGroupMask)

