Source 2 Viewer v20.0
Overdraw heatmaps, 3D sound in the map and model viewers, rain and puddles on CS2 maps, and a graph view of how map entities are connected.
Overdraw Debug View
Renders a heatmap of triangle overdraw using the same shader as the Source2 tools, accurate to the game and can be used for optimising maps.
3D Sound System
Map and model viewers now play sound. vsndevts events are mixed on their own thread with distance volume curves, stereo panning and per-mix-group levels.
Performance Stats
New "Debug Performance" option showing general renderer stats, allocations and timings.
This (especially stats) can be used as an analogue for real source2 rendering to some degree in order to help optimise maps, things like total drawcalls, materials, etc are accurate.
Puddles and Rain
CS2 environment materials render their wet weather state, with puddles, a wetness sheen, scrolling wave normals and procedural rain splashes.
Entity I/O Graph
Entity lumps and maps now have an entity I/O graph tab, drawing every entity as a node with its Hammer editor icon and every connection as a labelled wire. Nodes link with the 3D viewer.
Pulse and Animation Graph Viewers
Pulse graphs are rebuilt from their compiled bytecode back into readable node graphs, and AnimGraph 1 graphs draw alongside them, both compiled and straight out of the editor. Every graph viewer shares one canvas with panning, zooming, search, filtering, island focus and image export.
CS2 Bomb Blast Visualization
Mirrors CS2's Baked bomb damage debug view, drawn as animated arrows pointing along the blast direction, coloured from green where a blast is lethal through to red where it is harmless.
Untriangulated Hammer Meshes
Meshes decompiled into Hammer meshes are no longer a wall of triangles: adjacent triangles sharing a material are merged back into quads.
GUI
- Added an entity I/O graph tab to entity lumps and maps
- Added
point_templatespawn wires and two-way navigation with the map viewer - Added a pulse graph tab rebuilt from compiled Pulse bytecode
- Added pulse loop nodes, timeline cells and variable hubs
- Added an AnimGraph 1 graph tab for compiled and uncompiled animation graphs
- Added a shared graph canvas with a zoom-faded dot grid, Ctrl+0 to fit, and wire gutters between columns
- Added a graph sidebar with search, filters, a colour legend and image export
- Added a CS2 bomb blast visualization
- Added a bomb damage viewer for
baked_bomb_damage.vdata_cfiles - Added a render statistics overlay for triangles, draw calls and lights
- Added a particle snapshot (
vsnap) viewer - Added a viewer for uncompiled KV3 text files
- Added back and forward navigation to the package viewer
- Added a "Level of Detail" dropdown to the model viewer
- Added an Inputs tab to the entity info panel
- Added a "Reconstructed phonemes" tab to sounds with lip-sync data
- Added a plaintext phoneme
.txtdump when extracting those sounds - Added an "Export image" dialog for SVG-backed images
- Added a volume slider and per-tab muting
- Added a Play Endcap button and detail level selector to the particle viewer
- Improved the AnimGraph 2 viewer with expandable state machines
- Model viewer
- Added an "Additive (over bind pose)" checkbox
- Improved "Show Root Motion" to walk the model through the loop point
- File previews
- Added a loading panel with the file icon, name and a progress bar
- Changed previews to collapse the side panel when too narrow
- Enabled barn lights by default
- Changed the map viewer to open at a player spawn
- Changed camera FOV to horizontal degrees at 4:3 defaulting to 90, and added "Viewmodel FOV"
- Changed entity focus to avoid camera spots inside geometry
- Changed "Show Render Timings" into a "Debug Performance" selector, cycled with Tab
- Changed map loading to warm up shaders up front, removing fly-around stutter
- Changed the entity properties grid to open resource paths on double click
- Fixed concurrent OpenGL window creation crashing viewers and thumbnails
- Fixed the console tab dropping lines when several threads logged at once
- Fixed extracting a file over a larger one leaving the old tail appended
- Fixed files added to a VPK being listed twice
- Fixed models whose LOD0 is empty rendering nothing
- Fixed the opening fly-in skipping straight to its end position
- Fixed the FPS counter reading far too high after opening a scene
- Fixed playback of some MPEG 2.5 MP3 files
Renderer
- Added a 3D sound system to the map and model viewers:
- Map ambience from
env_soundscape,snd_soundscape,point_soundeventandsnd_event_point - Animation sound events, following the named attachment
- Player footstep, jump, landing, gear and fall damage sounds, plus CS2 viewmodel attacks
- MP3 gapless trimming, 8, 16, 24 and 32-bit PCM, and MS ADPCM
- Map ambience from
- Added a simulated entity system running map entities on a fixed 64 tick
- Added 2.5D tiled light culling, with
LightTiles,EnvmapTilesandSubgroupsdebug modes - Added a
QuadOverdrawdebug render mode painting overdraw as a heat map - Added dedicated shaders for Deadlock's
pbr.vfx,environment_blend.vfxandcitadel_overlay.vfxmaterials - Added wet weather rendering for CS2 environment materials
- Added subsurface scattering, with per-vertex or computed curvature and per-channel normal softness
- Added a second specular lobe for materials that author one
- Added a second sun shadow cascade for sharper shadows near the camera
- Added adaptive shadow map resolution for dynamic lights
- Added the legacy
light_omni,light_spotandlight_orthoentities used by Half-Life: Alyx and SteamVR Home - Added real time
light_rectarea lights - Added local post processing volumes, crossfading over an entity's
fadetime - Added rendering of
path_particle_ropecables - Added rendering of the effects a model references in its
particles_list - Added the
env_particle_glowentity and particle sound events throughC_OP_RenderSound - Added a dedicated first-person viewmodel pass, fixing the CS2 weapon clipping into geometry
- Added a Debug Physics Traces checkbox drawing hulls, swept boxes and contact points
- Added an opaque refraction pass, so refractive glass draws after the framebuffer grab
- Added root motion for animation graph clips (
vnmclip) - Added a Template Entities layer grouping
point_templatechildren with their template - Added engine-matching wildcard targetname lookups
- Reworked the particle sprite and trail shaders around the spritecard's compositing model:
- All fifteen
SpriteCardTextureChannel_tchannel masks and all seven blend modes in the sprite shader - Up to five texture layers, each with its own sprite sheet, plus gradient layers
- Outlines, HSV shifting, desaturation, fog, and distance and edge-on fades
- All fifteen
- Improved particle trails to stretch along the direction of motion, taper from head to tail, and batch into one draw call
- Implemented the particle endcap phase, with its eight operators and replaying endcap children
- Implemented child particle systems honouring start delay, endcap-only and detail tier flags
- Implemented 29 more particle initializers and operators, covering sequential paths, noise, culling, distance constraints and control point remapping
- Implemented curved particle paths with the authored midpoint bulge
- Implemented the
F_USE_NEW_BLENDINGheight band blend for CS2csgo_environment_blendmaterials - Implemented the normal morph bundle, so lighting on morphed faces follows the deformation
- Improved nine particle functions to read fields they were ignoring
- Improved specular shading with a multi-scattering environment BRDF
- Rewrote walk mode player movement to be framerate independent:
- Multi-plane collision clipping, stair steps, jump stamina and stuck recovery
- Surfing and strafe jumping, switched on for
bhop,surf,kzanddrmaps - Brush entity collision, and walking on a model's own physics in the model viewer
- Esc releases the mouse, and a second press leaves walk mode
- Changed particle simulation to the engine's timing, instead of banking time and advancing at most one 1/120s step per frame
- Changed particle randomness to the engine's seeded shared table
- Changed the particle starting radius to the engine default of 5, from 1
- Changed the renderer to bind vertex attributes to fixed canonical slots
- Changed GPU culling to default off on Intel integrated graphics
- Changed camera dragging to hide and pin the cursor instead of wrapping it at the viewport edges
- Raised the barn light budget from 128 to 320
- Removed the legacy CPU occlusion culling path in favour of the GPU depth pyramid
- Fixed maps rendering far darker than in game
- Fixed the pre-simulation fast-forward not re-running on restart, so a settled effect comes back relaxed
- Fixed particle functions reading the wrong schema keys or ignoring authored fields
- Fixed particle bounding boxes culling effects early or keeping them alive off screen
- Fixed particles spawned in a sphere bunching toward its centre
- Fixed untextured particle renderers drawing the error checkerboard
- Fixed material textures landing on the wrong shader input
- Fixed samplers left on texture 0 reading an incomplete texture
- Fixed
Multiplyfalling through to the additive blend function, and gaveModThenAddits own - Fixed NaN pixels from
pow(0, 0)in fog, vignette and levels adjustment - Fixed the MSAA resolve turning NaN samples into white that blew out bloom
- Fixed directional lightmaps not normalizing their decoded light direction, and softened it on flat surfaces
- Fixed cloth materials losing energy in both the direct and indirect lobes
- Fixed lights pointing at the mirror image of their pitch
- Fixed a vertical
light_environmentproducing NaN sun shadow matrices - Fixed
env_skyignoring itsbrightnessscale - Fixed washed out RGBM light probes and cubemaps in SteamVR Home
- Fixed unbound bone transforms making models render wrong on Intel drivers
- Fixed aggregate fragments drawn with another fragment's transform
- Fixed out-of-range tints such as a
renderamtabove 255 wrapping around - Fixed shadow, atlas and histogram buffers leaking when a tab was closed
- Fixed animation graph clips (
vnmclip) playing back too fast - Fixed procedural cloth bones staying at bind pose in the skeleton overlay
- Fixed flex values and root motion leaking into the next animation
- Fixed invisible
playercliphulls blocking ray traces - Fixed loading an asset with no physics parts crashing
- Fixed the model viewer crashing when toggling mesh groups
CLI
- Added a
--gameargument pointing at agameinfo.gifile, so assets outside the game folder resolve - Improved the glTF animation filter to match by leaf name and report entries that matched nothing
- Changed
--outputto write to the exact filename given for a single--vpk_filepathmatch - Fixed textures decompiled from a VPK not writing their image files
- Fixed glTF exports from nested VPKs colliding at the output root
- Fixed
--statson VPKs skipping.vcs,.nav,.vfe,.vfontand.uifontentries - Fixed
--vpk_listsilently extracting when combined with--output, which is now an error
Library
- Added root motion to glTF animation exports, so a walk cycle travels instead of running in place
- Added more of a model to glTF and DMX exports:
- Morph target weight animation, so facial and flex animation plays
- Additive animations as delta tracks, or composed with
--gltf_compose_additive - The clips a model's animation graphs reference, plus secondary skeletons
- Material groups (skins), local hierarchy overrides, and
vnmclipfloat curves
- Added writing of binary KV3 version 5, with LZ4 and Zstandard compression
- Added a public entity simulation API in
ValveResourceFormat.Renderer.Entities - Added typed entity I/O with
EntityLump.ConnectionandEntityIOTargetResolver - Added untriangulated Hammer meshes to decompiled maps
- Added animation graph clips to the animation API:
AnimationGraphLoader,AnimGraphModelInfoandSkeletonRetargeter - Added typed
vdataparsing in the newValveResourceFormat.ResourceTypes.GenericDatanamespace - Added nav mesh data previously skipped as unknown bytes
- Added a particle API for building systems without a resource, including
PathParticleRope - Added eight members to
ParticleFieldand theParticleDetailLevelenum - Added
ModelLodInfodescribing a model's LOD levels and switch distances - Added the
navmeshcustomdata1,modeldoc41andvpcf66KV3 format ids - Added the
MSLTmeshlet block,Texture.RadianceCoefficientsand the remaining texture metadata - Added
ShaderRegistryfor mounting your own shader directories - Added support for version 71 compiled shaders
- Implemented writing Panorama blocks back out
- Improved NTRO parsing, printing enum fields as their enumerator name instead of a raw number
- Improved decompiled animation graph layout to match the graph viewers
- Improved tools asset info parsing
- Improved decompiled shader output:
- Dynamic expressions resolve more variable hashes to their real names
- Eight more parameter UI types are named
- Changed glTF export to bake the Source-to-glTF conversion into rest poses, vertices and keyframes instead of a root node
- Changed map decompilation to fold duplicate
point_templatechildren into a single entity - Fixed decompiled angles collapsing when an object points straight up or down
- Fixed misaligned lightmaps in glTF map exports
- Fixed baked per-vertex lighting written into the glTF vertex colour attribute
- Fixed the
light_environmentsun pointing the wrong way in glTF exports - Fixed extracted
vnmclipclips coming out rotated - Fixed exported DMX files being rejected by Blender Source Tools
- Fixed animations of different models overwriting each other on export
- Fixed procedural cloth bones duplicated on model round-trips
- Fixed models with more than 32 mesh groups
- Fixed Hammer meshes ignoring their scene object transform
- Fixed signed
Integer64entity properties printing as huge positive numbers - Fixed local addons not resolving their loose files or the other addons they depend on
- Fixed a crash extracting an HDR cubemap that has no material unpack info
- Fixed sprite sheet rectangles losing their last row and column
- Fixed sounds carrying emphasis data losing all of their lip-sync phonemes
- Fixed the
clamp(x, 0, 1)tosaturate(x)rewrite almost never firing in decompiled shader source - Fixed compiled shader texture channel mappings and dynamic combo ids
- Public API moved around a lot this release:
Animationsplit intoSequenceAnimationandClipAnimation, with playback through oneAnimationPlayerper skeletonCameraspeaks Source QAngles, and its pitch now measures positive downwardsValveResourceFormat.Utils.GraphLayoutwas removed outright, with no public replacement- The
EntityTransformHelpermethods were renamed after what they return Renderer.EnableBarnLightsreplaces theViewConstants.ExperimentalLightsEnabledfield- Formats use the engine's
ImageFormatenum, removingFramebuffer.Stenciland the attachment format records - Vertex buffers share a
VertexInputLayoutAPI, removingDrawCall.VertexArrayObject RenderMaterialownsMaterialInputs<T>, removingDepthOnlyProgramand collapsingShader.SetUniform1-4- The legacy CPU occlusion and shadow binning APIs were removed, and
IFileLoadernow requiresGetFileStream - A long tail of renames across textures, nav meshes, panorama, shaders and tools asset info