Releases: ValveResourceFormat/ValveResourceFormat
17.0
Modernized GUI Theme
The entire GUI has been redesigned with a modern dark theme (while still based on Windows Forms; we are aware there are many small issues), many fixes were done to high DPI support, all icons have been replaced with scalable SVG icons, a custom titlebar has been added. The new changes include better main tabs, they now have fixed width which shrinks to fit without scrolling when you many tabs. Tabs now have a close button. The app logo has been tightened up.
![]() |
![]() |
Async Loading and Threaded Rendering
OpenGL rendering now runs on a dedicated background thread, significantly improving UI responsiveness during file loading and navigation. Resources are now loaded asynchronously to not block the UI. This also makes the experience of loading file previews in VPK nicer.
Animation Node Graph Viewer
Animation graphs 2 can now be visualized as interactive node-based graphs with automatic layout, wire routing, panning, zooming, and keyboard navigation support.
Improved Audio Player
The audio player has been redesigned to look more modern and render the entire file audio waveform.
Improved Material Viewer
Materials now include an updated side panel which shows all the supported properties which can be changed on the fly.
Orbit Camera
It is now possible to orbit a camera around any object (raycast) in front of the camera while holding Alt.
GUI
- Added Animation Node Graph Viewer for visualizing animation graphs
- Added Material property editor panel with color picker and real-time material updates
- Added vpost (LUT) file viewer support
- Added camera orbit mode with physics ray tracing to automatically find orbit targets
- Added camera transition animation when loading maps
- Added smoother camera movement
- Added panning with mouse wheel while holding modifier keys (Shift/Ctrl)
- Added close buttons to individual tabs
- Added ".." entry to navigate to parent folder in VPK list view
- Added tab showing sizes of skipped raw buffers in resource viewer
- Merged "check for updates" into the about dialog
- Find button is always enabled and will also work on tabs that have text editors
- Improved lighting by sampling ambient diffuse from cubemap when no light probe volumes exist
- Improved keyboard movement in texture viewer
- Improved exception dialog display
- Improved the audio player
- Changed to display root files when opening a VPK in list view
- Changed to fade out
point_cameraentities when the camera gets close - Fixed panning camera (hold shift) to correctly pan the viewport
- Fixed double-click on folders incorrectly opening files
- Fixed double-clicking on VPK tree items
- Fixed VPK preview models having their reader disposed prematurely
- Removed horizontal scrolling on all tree views
- Optimized loading maps
- Optimized OpenGL bindings loading without reflection
- Optimized game folder scanning to avoid duplicates from different AppIDs
CLI
- Improved shader extraction to only decompile highest available shader model
- Added a message if numeric input VPK is specified but _dir.vpk exists
Library
- Added MeshOptimizer vertex codec v1 support
- Added NavMesh v36 file format support
- Added MeshAdjacencyBuffer block support
- Added Deadlock model gamedata nodes support
- Added physics body gamemarkup data for CS2
- Added decompilation of FeetSettings to Feet vmdl nodes
- Added SpecularColor to glTF exports
- Fixed materials with specular factor losing textures in glTF export
- Fixed flipped SrgbRead and sampler starting point (v70)
- Reduced runtime reflection in file type detection
16.0
We've generated xmldocs for all public facing methods and properties in the library, and now an automatic API documentation is generated using docfx,
which is available at https://s2v.app/ValveResourceFormat/api/ValveResourceFormat.html
GUI
- Settings will now open as a tab, instead of a window
- Added orbit camera
- Added EXR option for "save to disk" feature in Texture Viewer
- Added mip size display in Texture Viewer
- Added detection of unicode byte order markers in byte→text viewer
- Added animation preview time and frame progress display
- Enabled occlusion culling by default in the map viewer
- Improved shadow map rendering to smoothly fade out last 8%
- Improved "Transmissive Backface NdotL" to work for more material types
- Ignore lower map mesh LoDs from rendering
- Changed default SVG view to transparent
- Fixed 3rd CS2 blendable material layer not appearing
- Fixed wireframe mode to skip drawing the 2D skybox
- Fixed texture viewer to resize output bitmap using selected mip level size
- Fixed vwrld export not getting the full path
- Fixed bookmarks not appearing instantly on explorer open
- Fixed resource disposal when closing tabs
- Changed to store env maps in separate AoS buffer with optimized instance indices
- Changed to store light probes in combined buffer with max probe count of 128
- Cleaned up renderer code to make it more self contained
- This build has some known issues
- Object Reference Exception when creating vpk from folder
- Object Reference Exception when previewing a model within vpk
Library
- Updated to .NET 10
- Added basic support for exporting container based vsnd files
- Added sound construction from
CVoiceContainerEnvelope - Added support for NTRO indirections count 2
- Added texcoord1 stream decompilation in vmap
- Changed vnmskel dmx serialization to binary format
- Fixed exporting vsnd data even if there is sound data
- Fixed support for
m_pSemanticNamestored as byte array - Fixed decompiled .vnmskel crashing Source 2 tools on compile
- Fixed
_classbeing overwritten in nmclip extract - Fixed loading particles that use UI textures encoded as PNG or JPEG
- Removed
CSGOItemresource type, renamedCSGOEconItemtoEconItem - Renamed
SnaptoParticleSnapshotresource type, and the oldParticleSnapshotis nowParticleSnapshotLegacy
15.0
Resource Serialization
This release adds a first but important step in being able to serialize resources back to binary files
by just calling resource.Serialize(stream). Not all block types are supported, but most importantly
binary keyvalues3, plaintext blocks, and raw binary blocks (meshes) are supported.
This already allows writing a majority of modern files that do not require legacy blocks.
CS2 Water
Thanks to @H7perus for reverse engineering the CS2 Water Shader. This shader features refraction, ray marching, caustics, screen space reflections.
Source2Viewer_FancyWater.mp4
CS2 Foliage
Assets using the foliage shader now react to wind.
Source2Viewer_Foliage.mp4
GUI
- Improved water shader rendering for CS2 maps
- Added transmissive lighting for CS2 foliage materials
- Added foliage vertex animation support
- Fixed CS2 models being fully transparent in screenshots
- Added physics wireframe rendering with line polygon mode
- Improved entity handling - entities without classnames are now ignored
- Added lightmap specular occlusion viewing
- Pressing Escape now unselects any selected nodes
- Added support for Layer 3 in CS2 Environment shader
- Improved physics (clipbrush) renderer with better lighting and reduced flicker
CLI
- Added Windows ARM64 build
- Added VCS (shader) decompilation support
- Added OS architecture to --version output
Library
- Enabled AOT for the VRF library
- As a test, added a
ConvertBinaryKV3ToTextmethod for unmanaged callers
- As a test, added a
- Added KV3 Shaders support (vcs3)
- Added resource serialization support for KV3 blocks
- Added
NmSkeldecompilation and extendedNmClipdecompilation - Added WebP texture support
- Added basic serialization support:
- Added binary KV3 serialization to v4
- Improved KV3 text parsing with format/encoding preservation
- Added
KV3IDstruct and lookup system - Added serialization for
RERL,MIDX, andMVTXblocks - Added support for plaintext block serialization
- Moved SPIRV reflections from GUI to VRF library
- Performance optimizations:
- Improve FPS by rendering dense meshes first
- Precompute linear material colors in CPU
- Improved
SrgbGammaToLinearperformance - Reduced memory allocations in various parsers
- Added tools asset info v14 support
- Added entity_name KV3 flag support
- Added KeyValues property to Model (Source 1
$keyvalues) ResourceDatais now abstract- Fixed gltf serialization to not perform a pointless deep clone
14.1
Source2Viewer_nQ2ewgmgtD.mp4
GUI
- Added preliminary support for AnimGraph2
- Allow maps to load if the sky shader uses an unsupported version
- Fixed entities from
point_templatenot being positioned correctly in the map viewer and glTF exports - Fixed hardware texture decoder queue to be more consistent
- Fixed a few null exceptions
Library
- Added support for new
MVTXandMIDXblocks - Added support for compiler shader version 69 along with new zstd dictionary
- Added basic exporting of
vnmclipto glTF - Shader zstd dictionaries are now stored as resources instead of being hardcoded in the source code
14.0
This S2V release adds an entity list which allows you to filter and jump to entities in the map viewer, and view lines for the entity connections. Selection outlines have been added to properly visualize the edges of complex models.
GUI
- Added an entity list in map viewer, and standalone entity files
- Double clicking an entity in the list will jump to it in the viewer
- Has filtering by entity type, keys, and values
- Added yellow outlines for selected models
- Added AABB dimensions for selected models
- Added model stats (vertex and triangle count, etc) in the model viewer
- Added solid background checkbox to the model viewer to allow recording videos against a green screen
- Added a checkbox to view entity connections as lines between entities
- Added smooth camera transition when changing location programmatically in the map viewer
- Added vwrld and vwnod data tabs to the map viewer
- Added sun light based shading to Dota 2 maps and models
- Added depth feathering to CS2 sprite effects shaders
- Added saving original svg file from texture viewer
- Added a 200ms delay before previewing files to allow double click to open
- Added context menu option to open files without a viewer (useful for big maps)
- Improved some map loading times by decoding vertex buffers in parallel
- Canceling file contents search will now display partial results
- Increased overall app font size
- Fixed a crash on certain GPU drivers due to missing parallel_shader_compile extension
- Reduced some VRAM usage by using mat3x4 instead of mat4x4 for some buffers
- Upgraded to OpenTK 4, which is backed by the GLFW library
CLI
- Printing large blocks like
PHYSwill now output to console every 64MiB instead of running out of memory on the 2GiB string length limit
Library
- Improved glTF exporting
- Added exporting of physics (
vphys_cfiles and embedded PHYS blocks) - Physics are converted to meshes, and will use tool textures if available, and generated surface textures otherwise
- Write all Source 2 material properties as glTF material extras
- Added exporting of physics (
- Added
EntityIOTargetTypeenum - Removed obsolete
Resource.Block.Read()method
13.0
This release mostly focuses on refactoring the Source 2 shader recompilation to further improve our understanding of the system and make it easier to actually browse through the compiled shader variants.
GUI
- New compiled shader browser with a tree structure of all the programs and variants
- Added syntax highlighting for shader sources
- Added a setting to change default code viewer font size
- Code blocks that are bigger than 512 megabytes will fallback to plain textarea
FastColoredTextBoxis in fact not fast enough to display Deadlock's physics file
- Fixed inconsistent camera when opening files from model picker
- Fixed file contents search skipping last archive
- Fixed some particle operators
- Renderer will now pause if the app is not active/focused
- Single-file binary of S2V will now only extract native libraries instead of all the dlls into temp folder
- Enabled drag-and-drop of files from Chrome based apps such as the explorer in VS Code
- Disabled camera movement while holding control
- Added UvDensity, LightmapUvDensity, MipmapUsage render modes, light probe volume debug grid spheres
- Added
R16G16B16A16_FLOATvertex attribute format - Added special handler for viewing dmx files
- Added renaming of inputs and structures in vulkan spir-v reflection where possible
CLI
- Renamed the project from
DecompilertoCLI, if you relied on the path to compile it yourself this is a breaking change
Library
- Enabled C# nullables (still disabled in some files)
- If you have nullables enabled in your project, you may need to add some extra null checks
- Major refactoring of
CompiledShaderto align the structure and naming more closely to actual Source 2 shader code - glTF export improvements
- Fixed not waiting for textures to export correctly
- Exporting maps will now skip
csgo_player_previewmodelmodels - Fixed multiple vertex buffers
- Added small offset to overlays in gltf to reduce z fighting
- Added exporting of
light_environment - Export object tint as material base color
- Added
GridNavFilefor parsing for grid nav (gnv) files - Added support for discovering content files from
OfficialAddonRoot(CS2 community maps) - Added support for updated
.navfiles in Deadlock - Added support for changed
VBIBin Deadlock - Added support for decompiling ADPCM wav files
- Split hammer physics mesh to avoid issues with really big maps
- Material decompiler will now export all cubemap and array images
- Renamed
SNAPtoParticleSnapshot - Renamed
VXVStoVoxelVisibility- Come help us reverse engineer the
vis_cfiles!
- Come help us reverse engineer the
BlockTypeenum is now FourCC uint- Updated some enums to add missing values
12.0
S2V now features dark mode, texture viewer improvements, improved model decompiler, fixes to the explorer and the package viewer.
Dark mode
Dark mode is now available thanks to the release of .NET 9! By default it will follow your system theme, but you can change it in the settings.
There are a few issues in a some controls, but we expect these to be fixed in the next .NET 10 release.
Texture conversions
We've replaced our BCn (DXT5, BC7, ATI1N, etc…) texture decoders with another library (which we've helped test) to have more correct
and faster decoding of these textures.
As a reminder, when exporting textures in GUI, they will be decoded using your GPU when possible, so it avoids these CPU reimplementations.
We've also fixed a few bugs in the GPU-based decoders and the texture viewer.
There are also new options in the texture viewer such as viewing separate channels and UV wrapping. Read more below.
Breaking change
If you are using the CLI to export resources into glTF, you must now specify --gltf_export_format argument.
Reminder that you can always download a dev build before a new release to test new fixes.
GUI
- Added a setting to toggle the theme
- Texture viewer
- Added support for viewing standalone .svg files
- Added R/G/B/A channel separation option
- Added option to repeat texture twice to view the UV wrapping
- Added texture sampling selection
- Removed FPS counter
- Texture viewer will no longer render frames if nothing changed (saves battery)
- Fixed software mips to render at full size
- Fixed decode flags resetting sometimes
- Explorer
- Added support for detecting workshop content with split vpks (CS2)
- Files in bookmarks and recent will now display game icon
- Paths in bookmarks and recent are now abridged with the game name
- Fixed loading game icons after Steam update
- Package viewer
- Added sort arrow to headers
- Fixed clicking size column to sort by descending on first click
- Fixed right clicking files in search results not expanding the tree view nodes
- Fixed performance of rendering large lists (e.g. if search results display 10k files)
- Added Root Motion visualization to model viewer
- Fixed baked lighting on the new Deadlock map
- Fixed container sound files to not throw to view the KV3 data
- Fixed mip levels being reduced to 0 pixels
- Fixed hardware texture decoder not handling mip levels (only full size is exported though)
CLI
- Breaking change:
--gltf_export_formatargument is now mandatory for exporting assets to glTF - Files outside of a vpk can now be exported to glTF
- Recursive scanning will now read more supported files that are not resources (fonts, nav, flex scenes, closed captions)
Library
- Added support for
TBUFblock (Deadlock) - Added
UIFontFilePackageto decompile uifont files (you can decompile them with the CLI) - Added Animation Graph resource decompile support
- Model decompiler
- Groups animations into folders when available
- Added AnimGameplayTiming annotation exporting
- Added bone weightlist extracting
- Added support for exporting models with 8 bone weights (also in glTF)
- Fixed ragdoll colliders missing parent nodes
- Added support for parsing binary blobs in text keyvalues3
- Replaced BC1-BC7 texture decoders with a different implementation
- Added export support to EXR for BC6h textures
- Blocks now keep a reference to the parent
Resourceobject - Fixed decoding non-power-of-two ETC2 textures
- Fixed glTF exports to have deterministic texture indices
- Fixed 3D textures not mip-mapping depth
- Skip exporting aggregate meshes with a scale of zero in glTF
- Exporting glTF with satellite textures will now save glTF to disk before textures finish exporting
- Improved VfxEval OpCode names, fixed radians function mislabeled as Remap01ScaleOffset
11.1
This update was released to support new binary keyvalues 3 version added in Deadlock.
Reminder that you can always download a dev build before a new release is made to test the fixes.
Added navigation mesh visualization
Available in the map viewer, and when opening standalone nav files.

Happy holidays!
Certain models have procedural cloth bones which did not animate, and now they do. Also added support for new 8 boneweights per vertex.

GUI
- Added support for visualizing navigation meshes (.nav files)
- Added rendering support for 8 boneweights per vertex (new Deadlock hero models)
- Added support for animating procedural cloth bones (fixes clothes not animating)
- Added basic css file highlighter
- Catch gltf export exceptions in export dialog for better reporting
- Fixed incorrect scroll jump when expanding a nested folder that has only one item
- Fixed paused animations being off by a frame
- Fixed multiple issues with animations
- Implemented parsing Steam's librarycache/assets.vdf to get the game icons in beta client
CLI
--vpk_cachenow writes a header with version which invalidates the cache when S2V version changes- Added special
--i steamwhen using--statsto scan all Steam libraries automatically
Library
- Rewritten binary keyvalues 3 parser, added support for v5
- Added
NavMeshFileto parse nav files - Added PCM8 sound format
- Removed
VBIB.CombineRemapTables - Fixed KV3 text parser incorrectly adding double quotes when reading flagged value inside an array
11.0
NET .9
This release updates to the .NET 9 runtime. This brings a breaking change in form of enabling CET support, which may cause it to crash on unpatched Windows installations.
Signed binaries
The Windows executables are now signed!
Free code signing provided by SignPath.io, certificate by SignPath Foundation.
Experimental lights
Added a checkbox to activate experimental lights. If you love shaders, help us improve the rendering of these!
GUI
- Executable is now signed
- Added a welcome screen for new users
- Added post processing (color correction) support to map viewer
- Added an option to check for new updates daily
- Added a button in settings that sets the FOV to match CS2
- Added setting for shadow resolution
- Added basic syntax highlighting in text viewer
- Added render exposure slider in map viewer
- Added hardware occlusion culling
- Added a checkbox to activate experimental lights
- Fixed mouse not moving past right edge in fullscreen
- Various fixes for Deadlock updates
- Improved lighting in SteamVR Home
CLI
- Executable is now signed
- Added
--gltf_export_animationsand--gltf_animation_list - Added
--texture_decode_flags --vpk_filepathnow supports multiple paths separated by a comma- Parameters
-aand-bwill also process VPK inner files - Changed output of
--vpk_list
Library
- Updated to .NET 9
- Removed
REDIBlock, and upconvert it to KV3 based Resource Edit Info - Upconverted old
EntityLumpto KV3 - Added SIMD implementation of MeshOptimizer vertex decoder
- Added support for exporting HDR textures in EXR format
- Implemented int16/uint16 in binary KV3
- Added NmGraph resource types
- Added
GameFolderLocator(functions the same as the Explorer in GUI) FindFileWithContextnow support rooted paths- Do not fail material decompiler if the texture parameter no longer exists in shader file
- Reduced allocations in various places
- Updated
ObjectTypeFlags - Fixed reading quoted keys in text kv3
10.2
Implemented post processing and color correction, fixed lights in Half-Life: Alyx
We still have overall brightness to figure out, but maps looks closer to in-game now.
Some maps didn't even render the sun correctly, but now they do.

Added a welcome screen for new users
Promotes basic things like setting default app for vpk files, enabling the new auto update checks, and shows the explorer right away.

GUI
- Added a welcome screen for first time users
- Added an automatic update check
- Runs once upon app start
- Will not check more than once a day
- Disabled by default (can be toggle from the "Check for updates" menu)
- Added color correction support with a new post processing shader in map viewer
- FOV can now be specified with decimal points which allows matching in-game field of view exactly
- Added a button to set the FOV to 4:3 which matches CS2 FOV exactly
- Added a setting for changing shadow resolution
- Fixed mouse not moving past right edge in fullscreen
- Fixed incorrect lighting in Half-Life: Alyx
- Fixed some shader issues in Deadlock
CLI
- Added
--gltf_export_animationsand--gltf_animation_listto control which animations to export - Added
--decompileas an alias to--vpk_decompile - Added
--texture_decode_flagsto control HDR exports - Changed
--vpk_filepathto accept multiple paths with a comma - Changed output of
--vpk_listto be more verbose - Parameters
-a -bwill also process VPK inner files
Library
- Added
ValveResourceFormat.IO.GameFolderLocatorto find Steam game paths - Added support for exporting HDR textures in EXR format
- Added SIMD optimized implementation of the meshoptimizer vertex decoder
- Added support for int16 and uint16 types in binary kv3
- Added resource types for animgraph2
- Reduced allocations in various places
- Only export default animation for entities in glTF map export









