Download

Source 2 Viewer v21.1

Playable maps with working doors, buttons and triggers, in-app updates, animation graph playback in the model viewer, and cloth decompilation.

Cloth Decompiling

Decompiled models now keep their cloth. It is rebuilt from the compiled cloth data (FeModel) and written back into the vmdl, so it can be edited and recompiled.

  • Covers nodes, springs, chains, jiggle bones, collision shapes and proxy sheets
  • Proxy sheets are written out as their own DMX files, which the vmdl references
  • --skip_softbody_reconstruction decompiles a model without its cloth

Cloth decompilation is experimental. Most cloth recompiles to the same simulation, but not all of it does, so bug reports and contributions are welcome.

Physics and Collision Views

Physics and collision are now much easier to read.

  • Shapes draw see-through with edges
  • Triggers and tools materials are textured with their class or material name
  • A new Collision tree groups shapes by their interact-as tags
  • Auto Vis Groups hides tool brushes the same way Hammer does

In-App Updates

The viewer can now download and install its own updates from the About dialog, on a stable or dev channel. Each download is checked against its build provenance before installing.

Entity System and Playable Maps

Every map entity now spawns and runs through the entity system.

  • Play, Pause and Stop controls, and Stop resets the map so Play starts it fresh
  • Doors, buttons, triggers, trains and logic entities behave as they do in CS2
  • prop_dynamic responds to its inputs and outputs
  • Lights, fog, sky, post-processing and sounds run as entities, and many react to inputs
  • Entity connections can be fired by hand from the entity panel

Animation Graph 2 Playback

Models now play their AnimGraph 2 (vnmgraph) graphs in the viewer, through a C# port of the Esoterica graph runtime that Source 2's newer animation graphs are based on.

  • State machines, blend spaces, IK, warping and root motion all run
  • The model viewer can edit graph parameters, drag gizmos and single-step
  • The player body in walk mode is animated by the same graphs

Particle System Rewrite

Particle effects now look and behave much closer to how they do in game. The simulation was rebuilt to follow the engine, and more than 100 missing particle functions were added.

  • Force generators, constraints, expressions and snapshots (vsnap)
  • Particles collide with the world and spawn on animated models
  • Particles draw as models, projected decals, merging blobs, light beams and branching lightning
  • Effects from older games are upgraded through the engine's vpcf version chain up to version 66, so they play with the newest engine version

Model Decompiling

Decompiled models keep much more of the original model:

  • IK chains and the legacy IK control rig
  • Morph targets and the flex rules that drive facial animation
  • Every physics joint type, ragdoll joints and body markup
  • Attachment camera previews

Editable Hammer Paths

Ropes, cables and path entities in decompiled maps now come back as editable Hammer paths, with their nodes, tangents, closed loops and cable settings recovered.

VMix Graph Decompiling

Audio mix graphs (vmix) and graph-based vsnd sounds now decompile back to .vmix files for vmixtool.

VPK Editing

VPKs can now be created and edited in the viewer.

  • Add, rename and remove files and folders
  • Replace, skip or merge when something already exists
  • Save as one file or split into chunk files, with unsaved changes tracked
  • VPKs inside other VPKs open at any depth, including through vpk: links
  • The CLI can pack a folder with --vpk_create

Package Content Search

Package search now looks inside compiled files, so you can find a particle operator or material parameter anywhere in a VPK.

  • Filter by match case, whole word, regex, folder and extension
  • Cancelling a search keeps the matches found so far
  • The CLI has the same search through --vpk_search

Documentation

New documentation pages:

  • Where Counter-Strike 2, Deadlock, Dota 2 and Half-Life: Alyx keep their files, and how to find a file
  • Posing characters in Blender, taking screenshots and exporting images
  • What each format supports and what survives a decompile
  • Game search paths, reporting issues, privacy and the MCP automation server

The VPK guide now also covers creating and editing VPKs and recovering deleted files.

Half-Life: Alyx and VR Games

Half-Life: Alyx, SteamVR Home and Aperture Robot Repair now have their own lighting, shadows, fog, tonemapping and material shaders.

  • Baked vertex lighting, mixed shadows and light cookies
  • vr_hair and the parallax vr_eyeball
  • Citizens wear their configured outfits

Volumetric Fog

Deadlock and Half-Life: Alyx maps now show their volumetric fog, with fog volumes, height falloff and shadowed lights shining through it.

Real-Time Sun Shadows

Lightmapped maps now cast real-time sun shadows from static geometry on top of baked lighting, at Medium shadow quality and above. Very High quality adds a third shadow cascade.

Decals and Impact Effects

Shooting or knifing a surface now leaves a decal.

  • Impact particles, sounds and water splashes
  • Maps draw their info_overlay and env_decal decals

Screen Space Ambient Occlusion

Deadlock materials now get ambient occlusion (XeGTAO).

Map Clutter

Small detail props stored as clutter now show up in maps. They draw as instanced models, and the GPU culls them and thins them out by screen size.

Entity Helpers

Selected entities now draw the same helpers as Hammer, generated from each game's FGD files.

  • Volumes, radius spheres and direction arrows
  • Light cones and falloff
  • Lines to their targets
  • Selection bounds with their edge lengths

Model Controls

The model viewer gained more controls:

  • Body group dropdowns
  • Flex controller and pose parameter sliders
  • An attachment list, drawn in the scene
  • Simulated jiggle bones

Deadlock Navigation Views

Deadlock's navigation space and flow map files can now be viewed as map viewer layers, showing blocks, transitions, grid cells and the flow clusters of each hull. Layers use the game's hull preset names.

Light Probe and Cubemap Debug Views

Two new debug views help track down why a surface is lit the way it is: one shows the sample grids of light probe volumes, the other colours reflections by the cubemap they came from.

Sprite Sheet Animation

Sprite sheets now animate in the texture viewer.

  • Pick a sequence, with autoplay, loop and speed controls
  • Show the full sheet, outlines or the cropped frame
  • Extracting a sheet also recovers its sequence names, loop modes and original bounds

Per-Game Shaders

The renderer now has one shader per game shader, in per-game folders. Materials, bloom, tonemapping, fog and lighting follow each game instead of a shared approximation.

  • NPR hero lighting in Deadlock
  • Global light in Dota 2
  • Weapon stickers and bottle liquids in CS2
  • Environment map and light probe volume limits raised to 320
  • Separate cubemaps and probes are packed into atlases at load
  • Light probe volumes are looked up and blended per pixel

Scenes and Spawn Groups

  • Rendering was split into scene views, and sun cascades and barn light shadows draw as their own views
  • Skies, prefabs and stages load as spawn groups, and the 3D skybox draws through its own camera
  • The octree was replaced with flat static and dynamic node sets

Particle Simulation

The particle simulation was rewritten to store particles as structure of arrays. It moved from the renderer into the library, can run without a graphics backend, and steps a scene's particle systems across the thread pool.

Loading and Memory

  • Search paths and VPKs mount in the engine's order
  • Resource blocks can parse on first access, so files only pay for what they use
  • Material and particle textures stream in the background, smallest mip first
  • CPU vertex buffers and unused KV3 data are released
  • Hidden tabs and a minimized window give back texture memory and render targets

Performance

  • Maps skip what can't be seen, using PVS and info_visibility_box culling
  • Aggregate props switch by LOD, and instanced ones use GPU-driven indirect draws
  • The depth prepass is on by default
  • Physics traces run up to 1.58x faster

GUI

  • Particle viewer
    • Added Normal, Normal + Endcap and Endcap Only playback modes, a Loop checkbox and a Pause button
    • Added a "Collide With Floor" checkbox
    • Added child effect links to the function list
  • Map viewer
    • Added Play, Pause and Stop controls
    • Added Fire buttons to entity inputs and outputs
    • Added a References tab to the entity info panel
    • Added an "Auto Vis Groups" tree for hiding tool brush groups
    • Added a "Collision" tree, also in the model viewer, replacing the "Physics Groups" list
    • Added "Opaque Collision", "PVS Culling" and "Visibility Boxes" checkboxes
    • Added collision details, physics solid type, mass and joint count to the details window
    • Added navigation space and flow map layers for Deadlock maps
    • The Show Tool Materials checkbox is now a Show Tools toggle that turns off while playing
    • World layers are now a checkable tree nested by layer name
    • Walk mode now starts playing the map when entered
    • Following an entity name now selects every matching entity including wildcards
    • Entity list icons now use the iconsprite helper of each class
    • Moved the render mode dropdown above the viewport
    • Removed the "Show Static Octree" and "Show Dynamic Octree" options
    • Fixed layer toggles overriding objects hidden with Delete, and added U to show them again
    • Fixed viewers staying paused after leaving fullscreen or the entity info window
  • Model viewer
    • Added body group dropdowns, and flex controller and pose parameter sliders
    • Added an attachment list and visualization
    • Added animation graph controls with parameter editors and gizmos
    • Animation list now hides hidden sequences
  • VPK and package viewer
    • Added creating and editing VPKs
    • Added Replace and Skip prompts for existing files, and a merge prompt for folders
    • Added saving VPKs split into chunk files
    • Added a warning before editing a signed VPK
    • Added searching decompressed compiled files, with Match case, Whole word and Regex options
    • Added Only in folder and Extension filters, and a Search in folder context menu entry
    • Added opening, searching and copying vpk: links to VPKs nested in other VPKs
  • Updates
    • Added downloading and installing updates from the About dialog
    • Added stable and dev update channels
    • Added a Restart to update button and highlighted the Update Available badge
    • Added build provenance verification for downloaded updates
    • Fixed the update check offering an older release to a newer build
  • Texture viewer
    • Added sprite sheet animation controls
    • Particle textures now open with the alpha channel shown
    • Fixed saved and copied images blending the viewer background into transparent pixels
  • Material viewer
    • Added a cable preview for cables.vfx materials
    • Improved the sidebar with aligned rows and ranged sliders
    • Parameter list now hides renderer-only parameters the shader does not declare
  • Graph viewers
    • Added more AnimGraph 2 node types
    • Added entity I/O connection parameter maps to the I/O graph
    • Improved graph layout with aligned cards and routed wires
    • Improved the pulse graph tab to cover every compiled instruction
    • Graph tabs now load in the background
    • Fixed duplicate nodes in the entity I/O graph
  • Export and progress
    • Added elapsed time and estimated time left to the progress dialog title
    • Replaced the export log dialog with a progress bar showing the current file
    • Progress dialog now stays open and shows the total time and failure count
    • Export failures now show a dialog with the first failed file
    • Fixed GUI export skipping nested additional files
  • Errors and logging
    • Added the file path and parent file chain to error messages
    • Added Check for updates and Report buttons to error dialogs
    • Errors for files in newer formats now say the format may be unsupported
    • Paths in tooltips, errors and logs now use vpk: links and Steam-relative paths
  • Added steam: paths relative to an installed Steam app
  • Added sound metadata to the sound viewer tab
  • Added duration and sound columns to the choreo scene list
  • Added loading phase text under the file name
  • Added "Close all other tabs" and Copy URL to the tab context menu
  • Added a taskbar icon badge showing the game of the selected package
  • Added a Discord button to the title bar
  • Added drag and drop of relative paths and of paths as text
  • Added copying the selected reference path with Ctrl+C
  • Added graph viewer and audio player shortcuts to the bottom bar
  • Added file icons for 20 more extensions
  • Added --mcp to start an MCP automation server in Debug builds
  • Improved load times
  • Enabled raw mouse input for mouse look
  • Repeated resource blocks now open in a single tab listed by embedded mesh name
  • Scene viewer now uses the default fullscreen gamma of 2.2
  • KeyValues blocks over 64 MiB now offer a Save as text button
  • Audio previews now play through WASAPI
  • Texture and graph viewers now stop presenting frames when nothing changed
  • Hidden tabs and the minimized window now release texture memory and render targets
  • Increased the default maximum texture size from 1024 to 10240
  • Fixed settings being overwritten with defaults when the file could not be read
  • Fixed closed tabs staying in memory
  • Fixed map loading continuing in the background after closing its tab
  • Fixed a crash when closing a tab while its file was still loading
  • Fixed races in the render loop, package previews, tab disposal and shader loading
  • Fixed reloading a file that was opened from a package
  • Fixed object picking reading the row above the cursor
  • Fixed multiline tab rows jumping out of order when selecting a tab
  • Fixed windows minimized while maximized restoring to normal size
  • Fixed the saved camera list not remembering the selected camera
  • Fixed sounds not starting at the beginning when opened
  • Fixed group box titles not rendering under Wine

Renderer

  • Particles
    • Added particles drawn as models
    • Added particles drawn as projected decals
    • Added particles drawn as a merging metaball surface
    • Added deferred particle lights and light beams
    • Added particle ropes drawn as splined ribbons
    • Added screen-space particle effects
    • Added branching lightning for particles
    • Added upgrading every older vpcf format on load
    • Added spherical harmonics, depth and illumination gradient spritecard textures
    • Added previewing unset control points at the particle editor defaults
    • Added scene lighting to sprites, trails and ropes from light probes, the sun and barn lights
    • Added collision with scene geometry and placing particles on the ground
    • Added particle events that child systems emit from
    • Added an effects bloom pass for bloom-only particles
    • Added ripples, silt and foam on CS2 fancy water
    • Added refraction and per-particle alpha test to spritecards
    • Added depth feathering, motion vector sheet blending and distance alpha edge softness to sprites
    • Added barn and capsule omni2 particle lights
    • Added control points placed at entities named by cpoint keys, plus data_cp and tint_cp
    • Implemented the wind, plane and vortex force generators, and box, self and path constraints
    • Implemented model, hitbox, bone and skinned snapshot functions, and scalar and vector expressions
    • Implemented 47 more operators, 23 initializers, 18 pre-emission operators and 13 transform input functions
    • Improved particle cables with Catmull-Rom curves, domed end caps and the cable shader
    • Improved trails to composite every texture layer
    • Improved sheet frames, cropping, flipping and view angle fades
    • Improved emitters, restart and endcap handling, pre-simulation and time steps
    • Particle culling and fading now use the root system's distances
    • Particle systems now stop simulating when not drawn or past m_flMaxDrawDistance
    • Scene particle systems now simulate on multiple threads
    • Effects now play the same on every load
    • Sprites and trails now draw as instanced quads sorted back to front
    • Raised the particle limit from 5000 to 20000, and 100000 for GPU systems
    • Fixed distortion layers drawing their texture as colour
    • Fixed particle rotations using the wrong Euler angle order
    • Fixed default values of 11 operators and initializers
    • Fixed particles spawned mid-frame starting from a moving control point's end position
    • Fixed particle sounds playing on after their particle died
    • Fixed particle system bounds ignoring trail length
    • Fixed particle cables and ropes not being pickable or outlined
  • Map and entity system
    • Added spawning of every map entity through the entity system
    • Added entity helpers and selection bounds drawn over the final image
    • Added func_tracktrain and path_track trains that carry the player
    • Added func_breakable, func_brush, func_physical_button and func_combine_barrier
    • Added trigger_once, trigger_multiple, trigger_look and point_teleport
    • Added logic_auto, logic_case, logic_relay, logic_timer, logic_compare and logic_branch
    • Added math_counter, ambient_generic and env_explosion
    • Added prop_dynamic inputs and outputs
    • Added move parent following for entity system entities
    • Added loading point_prefab and info_spawngroup_load_unload stages as spawn groups
    • Added point_template runtime spawning with ForceSpawn
    • Added sky_camera_volume skies with optional shared sun shadows
    • Added Panorama world panels as rectangles facing the player
    • Added projected decals for bullet and knife impacts, and info_overlay decals
    • Added map clutter, material overrides and vertex stream overrides on placed models
    • Added trigger volumes textured with their class name, and labelled tools materials
    • Added doors, buttons and func_movelinear with locking and double doors
    • The 3D skybox now draws with its own camera, fog and lighting
    • Fixed intact func_shatterglass panes drawing as broken glass
    • Fixed hitboxes and attachments on models using external meshes
    • Fixed hitboxes drawing at the model origin
  • Walk mode
    • Added ladder climbing
    • Added pressing buttons and doors with E, and riding moving platforms
    • Added CS2 recoil patterns, bullet tracers, impact sounds and water splashes
    • Added a crosshair
    • Movement now uses fixed 64-tick steps
    • Footsteps, takeoff and landing sounds now follow the surface underfoot
    • Crouching now uses Counter-Strike duck speed, spam penalty and unduck clearance
    • The player body now plays the model's animation graph with a full-body shadow
    • The knife now uses CS2 timing, sounds and range
    • Half-Life: Alyx, SteamVR Home and Aperture Robot Repair now use their own player hulls
    • Removed ground pre-strafe
    • Fixed the player getting stuck stepping along walls
    • Fixed box overlap tests hitting just outside thin convex hulls
    • Fixed older collision tagged CONTENTS_SOLID being passable
    • Fixed the camera moving along the view when leaving walk mode
  • Animation and models
    • Added AnimGraph 2 (vnmgraph) playback
    • Added CS2 player weapon aiming and hand placement graph nodes
    • Added sequence auto layers, pose parameter blends and flex morph masks in the mixer
    • Added all eleven bone constraint types
    • Added simulation of jiggle bones
    • Added eyelid morphs driven by bone constraints on CS2 agent models
    • Bone-merged models now pose by bone name when skeletons differ
    • Fixed flex animations on models using an external morph set
    • Fixed morph sets without a texture atlas and standalone vmorf_c sets failing to load
    • Fixed rotation order when blending additive animations
    • Fixed meshes with two bone weights skinning incorrectly
    • Fixed meshes with their own inverse bind pose deforming wrongly
  • Lighting and shadows
    • Added real-time static sun shadows in lightmapped scenes at Medium shadow quality and above
    • Added a third sun shadow cascade at Very High quality
    • Added light styles with light_styles.vdata curves and inputs and outputs
    • Added Deadlock lightmap version 8.5 support
    • Added bicubic filtering of baked lightmap shadows
    • Added per-pixel light probe volume lookup, blending and edge fading
    • Added sky and ground bounce ambient where no light probe volume reaches
    • Added rect light shading as area lights in Aperture Desk Job and Deadlock
    • Added disableshadows support for model entities
    • Added visible light geometry for light_rect and light_omni2 with showlight
    • Added lighting_origin attachments and shifting thin model lighting toward the viewer
    • Improved baked lighting for lightmap versions 8.1 to 8.4
    • Improved barn, rect and omni2 brightness, colour temperature and shape rounding
    • Improved light probe volume selection and object lighting
    • Improved shadow quality in the model viewer
    • Barn light limits now keep the largest lights on screen
    • Hidden tools materials that block light now keep casting shadows
    • Raised the environment map and light probe volume limits to 320
    • Fixed moving objects keeping their spawn light probe, environment map and tint
    • Fixed barn light shadows leaving out objects that block light
  • Half-Life: Alyx, SteamVR Home and Aperture Robot Repair
    • Added Aperture Robot Repair support
    • Added baked per-vertex lighting on placed props
    • Added spot light shadow maps (up to 16 per view) and light cookies
    • Added mixed shadows with info_dynamic_shadow_hint entities
    • Added Blinn-Phong and Schlick specular and projected environment maps
    • Added vr_monitor, vr_hair and vr_wireframe_hologram shaders
    • Added vr_glass_markable dust and backlight
    • Added SteamVR Home tint masks, paint blend layers, glass fresnel and indirect light textures
    • Added ModelConfigList support for dressing Half-Life: Alyx citizens
    • Added vr_xen_foliage vertex animation and vr_complex foliage animation
    • Improved vr_eyeball, vr_glass and vr_skin
    • Improved environment map and light probe assignment in VR maps
    • Improved VR tonemapping and bloom
    • Fixed SteamVR vr_standard reflectance, metalness, gloss and normal decoding
  • Deadlock
    • Added screen-space ambient occlusion
    • Added NPR hero lighting with stepped diffuse and a rim light
    • Added environment_layer, environment_simple, environment_parallax_layered and cosmic_veil shaders
    • pbr and environment_blend materials now always blend light probe volumes
    • Added projected decal materials
    • Added per-pixel bloom for materials that override it
    • Added Patron models with idle animation for npc_boss_tier3
    • Fixed overlay materials drawing as opaque and casting shadows
  • CS2
    • Added seam borders and bevels to environment blend materials
    • Added biplanar UVs and per-layer UV controls to environment materials
    • Added weapon stickers with wear, holographic and glitter layers
    • Added character material adjustments for brightness, contrast, hue and saturation
    • Added foliage trunk and branch deflection
    • Added csgo_simple_liquid bottle glass with liquid and bubbles
    • Reworked environment wetness with puddle height, wet edges and per-layer darkening
    • Improved environment, foliage, complex, water and barn light shading
    • Fixed opacity, ambient occlusion and direct specular of world shaders
    • Fixed decal textures being read as linear
    • Fixed the sun's specular highlight shining as a point
    • Fixed the csgo_water_fancy shader reading the wrong wave direction
  • Dota 2
    • Added sun, ambient light, fog and sky from ent_dota_lightinfo
    • Added the fixed tonemap curve
    • Added ambient effects on buildings, towers, trees and fountains
    • Added constant layer animation of units such as Radiant towers
    • Improved shading with global light, directional ambient and Phong specular
  • Fog and post-processing
    • Added volumetric fog with env_volumetric_fog_controller and fog volumes
    • Added env_fog_controller, and fog_type and angular fog to env_sky
    • Added gradient fog from a texture, and two-colour linear fog
    • Added the post-processing vignette
    • Added the default auto exposure range from gameinfo.gi
    • Rewrote the bloom mip chain per game
    • Fixed bloom being weighted by exposure twice
    • Fixed auto exposure clamping, compensation and adaptation speed
    • Fixed auto exposure metering the scene before translucent surfaces were drawn
    • Fixed cubemap fog blur and distance
    • Fixed local post process volumes using the camera position instead of the player's
  • Culling and loading
    • Added map visibility (PVS) culling of objects, particles and sun shadow casters
    • Added info_visibility_box culling
    • Added texture streaming that loads mips by on-screen size
    • Added aggregate LOD switching and GPU meshlet culling
    • Improved physics trace speed by 1.17x to 1.36x for boxes and up to 1.58x for rays
    • Improved map load time by skipping unused player animations and preloading resources
    • Reduced memory use by releasing unused KV3 data and CPU vertex buffers after upload
    • Enabled the depth prepass by default
    • Enabled GPU-driven indirect draws for instanced aggregate props
    • Particle textures now load asynchronously, smallest mip first
    • Translucent sorting now uses closest-distance order
    • The viewmodel now draws after the scene and its translucents
    • Fixed occlusion culling hiding objects past the screen edge in the previous frame
  • Debug views
    • Added "Light Probe Grid", "Light Probe Grid Surface" and "Cubemap Debug Colors"
    • Added RAM and GPU memory usage to the render stats
    • Reworked the infinite grid with antialiased lines and a horizon fade
    • Improved the selection outline with a fixed-width edge
    • Physics shapes now draw edges as lines
    • Translucent physics now draws with order-independent transparency
    • The Cubemaps render mode now marks each cubemap
    • Map collision now stays visible when world geometry is hidden
    • Made the render timings window more compact
    • Renamed the IrradianceDebug render mode to LightmapCharts
    • Fixed the selection outline ignoring morphs and outlining alpha-tested cutouts
    • Fixed QuadOverdraw counting for alpha-tested and vertex-animated materials
    • Fixed the sky being too dark in render modes without post-processing
  • Added mouse look for flight mode, toggled with Z
  • Improved entity focus framing of long or thin objects
  • Free-flight move speed now scales with the scene size
  • Renderer now has one shader per game shader, plus a fallback shader
  • Material translucency, overlay and shadow casting now follow compiled shader attributes
  • Fixed GGX specular highlights missing a factor of pi
  • Fixed self-illumination masks reading three channels and being read as linear
  • Fixed sound events failing to load when fields hold strings, lists or ranges
  • Fixed flying faster when holding several movement keys
  • Fixed rendering on the llvmpipe software OpenGL driver

CLI

  • Breaking change: --stats options were renamed to --test, such as --test_loader
  • Breaking change: conflicting or ineffective option combinations are now errors
  • Removed the macOS x64 and Linux 32-bit ARM builds
  • Added --vpk_create and --vpk_create_chunk_size to pack a folder into a VPK
  • Added --vpk_search and --vpk_search_options to search file contents, with case, word, regex and hex options
  • Added --shader_list_combos and --shader_combo to list and decompile single shader variants
  • Added --kv_flatten to print KeyValues files as path = value lines
  • Added --output - to print decompiled files to the console
  • Added --skip_softbody_reconstruction to skip cloth when decompiling
  • Added --gltf_keep_all_keyframes to disable animation keyframe reduction
  • Added --quiet and a summary of written files
  • Added steam: paths and vpk: links as --input, and steam: paths as --game
  • Added processing of VPKs inside VPKs with --block, --all and the shader options
  • The CLI now exits with code 2 when files fail to process
  • --output now treats a path without a file extension as a folder
  • --gltf_export_format now implies --vpk_decompile
  • The path filter is now case-insensitive with * and ? wildcards
  • --block now takes multiple comma-separated blocks
  • Extension filters now accept a leading dot, and --recursive_vpk no longer needs --recursive
  • --vpk_dir now lists files like --vpk_list
  • --vpk_list now also lists loose files in folders
  • --vpk_verify now verifies every VPK in a folder
  • --vpk_decompile now decodes non-resource files such as fonts
  • --game now accepts the game folder
  • Output now joins package and inner file paths with a colon
  • Fixed additional files losing their folders when decompiling into an output folder
  • Fixed --vpk_cache manifests recording files that were skipped or failed
  • Fixed shader decompiles not picking the highest matched shader model per platform

Library

  • Model decompilation
    • Added cloth reconstruction from FeModel
    • Added morph targets and flex rules
    • Added IK chains and the legacy IK control rig
    • Added every physics joint type, ragdoll joints and body markup
    • Added 1DBlend, 2DBlend, EmptyAnim, FaceposerKeys, ScaleSet and VSNAP nodes
    • Added animation group animations as anim files
    • Fixed collision of skinned models being written in the wrong space
    • Fixed meshes split across identical vertex buffers decompiling as several meshes
    • Fixed animation DMX files overwriting a mesh or each other
    • Fixed flex controllers of older games failing to load
  • Map decompilation
    • Added recovery of ropes, path node entities and cable attributes as editable paths
    • Added entity I/O connection parameter maps
    • Added painted prop vertex streams and materialoverride on prop_static
    • Added texture axes, scale and offset to Hammer meshes
    • Improved world geometry welding and splitting per material and tint
    • Improved physics geometry by dropping triangles covered by render meshes
    • Faces without UVs now use a grid-aligned projection
    • Fixed meshes merging quads across seams, hard edges and vertex paint breaks
    • Fixed brush entity rotation being lost
    • Fixed baked prop tint and alpha being lost
    • Fixed foliage props decompiling to Hammer meshes instead of prop_static
  • glTF export
    • Added morph normal deltas, sparse accessors and target names
    • Added AnimGraph 2 skeleton (vnmskel) export
    • Added skeletons to standalone .vmesh_c exports
    • Added world node material overrides and skins to map exports
    • Improved animation export by reducing keyframes within a tolerance
    • Improved file size with smaller vertex data types and skipped unused vertex data
    • Exports now always include the armature
    • Map exports now skip tools materials and lower LOD aggregate meshes
    • Fixed normal maps being exported with alpha
    • Fixed entity extras, now written per entity node with typed values
    • Fixed alpha modes, unlit materials and tint colours
    • Fixed instances with different tints sharing one mesh
    • Fixed repeated skinned models not binding to their own skeleton
    • Fixed prop skins replacing only one material
    • Fixed clip durations and quaternion sign flips
    • Fixed collision missing when stored in a referenced .vphys_c
  • Animation graphs
    • Added AnimGraph 1 group decompiling
    • Added time-controlled clips, alignment bones and more condition nodes to AnimGraph 2 decompiles
    • Improved vnmclip and vnmskel extraction to recover source filenames and base frames
    • Clips cut from one source animation now share a single DMX
    • Fixed vnmskel extraction not preserving the compiled bone order
  • Compiled shaders
    • Added support for compiled shader version 58
    • Added uncompressed, dictionary-less Zstd and LZ4 static combo blocks
    • Added mobile Vulkan attribute maps and specialization constants
    • Added naming of globals buffers, texel buffers, push constants and storage images in Vulkan decompiles
    • HLSL decompiles now use shader model 6.2 with native 16-bit types
    • DXIL shaders now show their hash instead of throwing
    • Removed s&box compiled shader support
    • Fixed parsing of version 61 compiled shaders
    • Fixed Vulkan binding offsets for most versions and mobile
  • KeyValues3
    • Added reading of binary int8 and uint8 values
    • Fixed files with multiple or newer type flags failing to read
    • Fixed LZ4 blobs failing to decode, and version 4 blob serialization
  • Game and package loading
    • Added NestedPackage for reading VPKs inside VPKs at any depth
    • Added PackageSearch and Resource.AnyBlockContents for content searches
    • Added gameinfo_branchspecific.gi reading and LayeredOnMod merging
    • Added game detection by Steam app id and from content search paths
    • Added mounting of local addon folders, and the base game for addons without a gameinfo
    • Added detection of Steam installed through Flatpak
    • Added detection of a native Linux or macOS Steam when running under Wine
    • Improved Steam detection from the registry, XDG_DATA_HOME, symbolic links and Snap
    • Changed the mount order of search paths and VPKs
    • Game folders now mount every pakNN_dir.vpk
    • File reading now lets other programs write, rename and delete open files
    • Fixed workshop content not finding its game in another Steam library
    • Fixed VPKs named like name_123.vpk being treated as chunk files
  • Added the FGD parser, EntityClass and EntityClassCatalog
  • Added ReadMode to Resource.Read for parsing blocks on first access
  • Added NavSpaceFile and NavFlowMapFile for Deadlock navigation files
  • Added ParticleSystemSimulation for simulating particles without a graphics backend
  • Added the vdsp, vwrlt and vwenvmap resource types
  • Added decompiling of vmix mix graphs and graph-based vsnd sounds to .vmix
  • Added Rubikon compound physics shapes
  • Added soft-body FeModel parsing in physics aggregate data
  • Added R11_EAC, RG11_EAC and R32_UINT textures, and the mip compression method
  • Added NTRO double, AABB, rotation vector, matrix, Euler angle and unique id fields
  • Added support for textures with a legacy resource header
  • Added support for animations that store frame data on their description
  • Added support for tools asset info versions 8 and 16
  • Added older world visibility layouts
  • Added nav mesh places, hiding spots, corner gravity and movable mesh settings
  • Added extracting fonts and gnv grid navigation files from packages
  • Improved sprite sheet extraction to recover sequence names, loop modes and original bounds
  • Replaced TinyEXR.NET with a built-in EXR writer
  • Replaced SharpGLTF.Toolkit with SharpGLTF.Core
  • Replaced ZstdSharp with the Zstandard support built into .NET
  • Replaced the bundled LZMA SDK with a new span-based decoder
  • Changed the target framework to .NET 11
  • ForceLDR now applies on top of decode flags and exports HDR cubemaps as one LDR image per face
  • Malformed animation and graph data now throws
  • Removed the resource file size mismatch check
  • Fixed reading old vsnd sound info, resource manifests and sound stack scripts
  • Fixed Zstd-compressed mesh buffers in MVTX
  • Fixed polymorphic structs, fixed-size arrays and nested pointers in NTRO
  • Fixed concurrent reads of one resource corrupting each other
  • Fixed anisotropic roughness textures decoding as normal maps
  • Fixed BC5 hemi-octahedral normal maps decoding with transparent alpha
  • Fixed raw JPEG, PNG and WebP textures extracting without their extension
  • Fixed decompiled files and text dumps formatting numbers with the system culture
  • Public API
    • Resource.Blocks is now IReadOnlyList<Block>, and Resource.Read lost its verifyFileSize parameter
    • Model mesh methods return ModelMesh and ModelMeshReference, and MeshGroups replaces GetMeshGroups
    • Animation was renamed to AnimationBase
    • Color32, MathUtils and AABB moved from the renderer to ValveResourceFormat.Utils
    • ControlPoint and the particle enums moved to ValveResourceFormat.Particles
    • SboxShader and MurmurHash2 were removed
    • Many other public members were renamed or removed

View commits since 20.1 | View milestone

Thanks to