- New functions:
- New P2P 1v1 race mode: race with a friend without having to set a server using a peer-to-peer connection;
- Experimental support for servers with client-specified cars and for changing car skins live (some features wouldn’t work for now, update for CM is coming soon).
- Major fixes:
- Linear color space: speculars fixed;
- Some track physics objects missing on any collisions fixed;
- The crash caused by missing cache subfolder “meshes_metadata” is fixed;
- IMGUI: fallback fonts fixed, rare characters should work in titles and such;
- Shadows computing now takes base surface normal into account as well, fixing an issue with the main building on Spa;
- A few issues causing GPU to crash (related to navigators, particles, filters, car swap and more) have been fixed;
- Some of NaN rendering glitches with refracting headlights fixed;
- Fixed some crashes with cars with encrypted colliders;
- Visual tyre wetness and AI alterations getting stuck on rain deactivation fixed;
- Surfaces FX audio fixed.
- Physics:
- “Extra contact points” experiment is back and enabled by default, no longer moves contact point laterally so it won’t affect FFB;
- New physics experiment optimizing colliders for track physics objects;
- New physics experiment tweaking track physics objects without explicit configuration (CoG fix, a bit of damping, a bit of friction);
- New physics experiment equalizing pits check thresholds across Assetto Corsa (available online as [PHYSICS_EXPERIMENTS] EQUALIZE_PITS_CHECK=1);
- New options in general disabling lap invalidation by AI or Physics API;
- Automatic Sine→Perlin upgrade (affecting invalid surfaces only) now upgrades to Simplex instead;
- Procedural surface noise better handles multiple tyre rays;
- A few other improvements for surfaces with procedural noise (better car placement, better ground plane computation);
- Cars occasionally exploding on certain surfaces fixed.
- AI:
- Steering is smoother (physically) at speeds below 7 km/h;
- Trajectories fixed (“cautious steering” tweak was messing things up);
- AI debug app now shows actual AI inputs instead of smoothed ones;
- If the “Tweak autopilot switching” option is disabled, AI inputs smoothing, as well as some other tweaks, will work properly anyway;
- “RACK_TRAVEL_LUT” stops working with autopilot as well (previously, it would stop for AIs to keep them safer, but not for the autopilot making testing more difficult).
- Extended track physics:
- New COG_OFFSET=AUTO for track object physics parameters applying CoG fix;
- COLLIDER_DEBUG from custom track object collider parameters removed, replaced with a checkbox in CSP Debug app;
- New _EXT_PERLIN_NOISE=SIMPLEX for track surfaces to use Simplex noise (basically Perlin but a bit better).
- Audio:
- New audio tweak: using traction control intensity for its audio volume (enabled by default);
- Collision audio for hits no longer cuts off, instead, new events are created live;
- CSP no longer plays hit audio for overwhelmingly scraping collisions, or scrape audio for hitting collisions;
- CSP ambience audio is no longer affected by doppler shift at all;
- Mumble voice chat: audio volume fading when talking or listening is disabled.
- New main menu:
- Better setup titles (let me know if I missed any abbreviations);
- If any setup tab title has a lower-case letter, CSP won’t adjust case;
- Leaderboard uses custom driver icons, if set;
- Look and behavior of disabled setup items improved;
- Scrolling of setup tabs has been fixed;
- EXT_VISIBLE_WITH works from the start, not waiting for something to change;
- Hidden tabs are fixed, no longer can be selected;
- Tab reset works for more types of tabs;
- Hold Shift and click on car preview in the main menu to change color in a single-player session.
- Other UI changes:
- Position of warning icons (the ones in the top left corner) and race flags fixed;
- Options to disable warning icons and hide racing flags, by default icons hide with Ctrl+H;
- “Center UI” option got an extra variant centering apps bar (and tasks switcher) as well;
- New pause menu: buttons don’t get clipped with photo mode anymore, buttons shift down if the menu has been moved to the bottom half of the screen;
- Recently added assists editor is optional, with a setting to turn it off;
- Starting lights shift upwards when the main menu is opened.
- Default Weather FX style:
- Brightness adjusted;
- White reference point accounts for post-processing exposure, ensuring the same brightness in different conditions (LCS only);
- Fog is a bit less bluish;
- Glare in the virtual mirror is reduced.
- Particles:
- Piece and spark particles: collisions with track improved, sparks use local heightmap, issue with sparks-car collisions misbehaving fixed;
- Fireworks use additive blending;
- Smoke behavior adjusted, positional variance no longer applies to most smoke types;
- Velocity of flame particles in track configs with flame intensity above 1 fixed;
- Particle sizes adjusted: pieces have a small chance of being large, flames are larger if fast.
- Grass FX:
- Localized randomization no longer jumps with origin shift;
- Shading improved;
- Grass disappearing for a frame with origin shift in OpenVR mode fixed.
- CSP Debug app:
- A checkbox showing outlines for track physics objects fixed;
- Dragging improved: forces are critically dampened to prevent oscillations, multiple cars can be dragged at once, track physics objects can be dragged as well;
- Click-to-teleport is merged with dragging, allows to orient car;
- Dragging tool allows to push or pull the car as well.
- Hotlap with multiple ghosts:
- Laps done with AI (with AI lap invalidation disabled using the new option) are marked;
- Copying of the best record to the place where AC would originally store a ghost is fixed, now includes layout ID.
- Miscellaneous:
- VR tweaks: options “Custom VR HUD” and “Skip post-processing” are enabled by default (it just looks so much better this way, and it’s compatible with LCS too);
- AC no longer raises an error with empty “aero.ini”;
- Other fatal AC errors are shown properly;
- Blown tyres of remote cars affect wheels positioning with custom motion enabled;
- Remote cars: angle of front wheels got a tiny bit of smoothing, fix for steering wheel angles range improved;
- CSP shows a warning if a Lua script takes more than a second to do something;
- If country name is missing, tooltip for its flag in chat will be hidden;
- Nice Screenshots: accumulate HDR summation is marked as not compatible with scriptable filters, will be paused when filters are active;
- Snow/ice definitions for “ek_akina_snow”;
- Timezone for “rt_lime_rock_park” fixed, added heading angle;
- AC timing with fewer than four cores, or with multithreading disabled, improved;
- Vintage scriptable filter: small update reducing dithering;
- “Show important steering wheels” tweak improved;
- Old tweak getting dynamic object balloons to move with wind has been fixed and improved;
- Slightly improved taskbar closing behavior;
- “Disable Steam interface” option renamed and reset, in case somebody enabled it by mistake (now, CSP won’t offer to activate it anymore);
- Neck FX temporarily pauses photo app FOV slider when changing FOV, for both to work better together and fix some issues with other components;
- Hotkey to toggle virtual mirror can be changed (CM update allowing to bind F… keys is coming soon);
- Active Steam overlay stops mouse hovering effects of IMGUI;
- With CSP flames enabled, original flames no longer waste time looking for textures;
- Rendering debug: new option forcing informative crashes on D3D11 errors;
- Crash reports are detailed by default, compact ones are pretty useless.
- Other fixes:
- Issue with wheels increasing in size online without custom motion in long races fixed (I would highly recommend to enable custom motion though);
- Analog odometers no longer break some textures with HDR enabled;
- Car LODs acting strange with 20+ cars in a frame are fixed;
- Decoding of animated GIFs fixed;
- Misaligned colliders of some track physics objects on Barcelona fixed;
- Walking Out: pause is working correctly when walking around;
- Synchronization of dynamic objects across clients online fixed;
- Borderless AC window saves its size and position properly;
- A couple of core fixes to prevent memory corruption happening in some rare cases;
- A few crucial fixes for memory profiler;
- Headless mode disables all the input (keyboard, gamepad and wheel), few other fixes;
- Fallback LOD no longer takes a frame to appear if other LODs are available;
- Flashing for jumped cars, or from ac.highlightCar(), fixed, shouldn’t affect grass anymore;
- Resetting extrapolation of remote cars on teleports slightly improved.
# Configs
- Car & track configs:
- New [TYRES_FX] RADIUS_OFFSET parameter allowing to alter visual radius of tyres;
- Glass materials: new NormalMapUVMult parameter;
- Brake Disc FX: compute of default value for CERAMIC adjusted to make them less frequent;
- A few improvements for live car config reloads;
- BLIND_SPOT car input and ac.getCarBlindSpot() fixed, now returns distances to the cars in front (as Z) and behind (as W) as well;
- [DATA] DI_…_… modifiers for digital instruments can use “BASE” instead of an index to affect all of them;
- [DATA] DI_…_ALPHA affects first version of text nodes as well;
- Track conditions tool shows input values as well;
- New [BASIC] SEASONS_DEACTIVATION_AWARE=0 to fix tracks that don’t expect YEAR_PROGRESS to be -1 when season changes are disabled, on by default for all but “dousojin_touge” and “dousojin_touge_1990”;
- Box guessing for track object colliders (trying to replace a mesh with a box with custom track physics) improved.
- Extended configs for online servers:
- Use [CUSTOM_PHYSICS] EXTRAPOLATE_STATE=1, 1, RAW to try a new approach to avoid shaking;
- Use [CUSTOM_PHYSICS] SMOOTHING_FACTOR=100 to make movement of remote cars more snappy and less smoothed (lower value for smoother movement, default value is 250);
- Add [EXTRA_DATA] VR=1 to sync the state of drivers using VR (requires AssettoServer);
- Use [EXTRA_RULES] ALLOW_PITS_JUMP=1 to allow jumping in pits by holding Ctrl and clicking on car preview;
- Set [PHYSICS_EXPERIMENTS] EQUALIZE_PITS_CHECK=1 to equalize thresholds of AC checking if car is in pits or not (experimental);
- Jump limit slightly improved, more sensitive to jumps side-to-side, default time reduced from 5 to 2 seconds, flashing is only present if the car intersects another car, cars no longer flash if collisions are disabled via Physics API.
# Scripting
- Common API:
- New properties for ac.StateSim: .isTrackOpen, .isTimeOffsetIgnored, .timePostOffset, .timePhotoModeOffset, .isAltOnlineRace;
- New ac.checksumCRC32();
- New string.urlDecode(), string.urlParse() and string.xor();
- New mat4x4:getEuler() returning Euler vectors from a matrix as a counterpart to mat4x4.euler() creating a matrix from Euler vectors;
- ac.INIConfig.parse(): use @car:N as include folder for “read()” expressions to work as well;
- New ac.getAssists();
- New ac.onCarSwap();
- Function ac.areShapesColliding() fixed: debug outlines for cylinders and capsules are aligned correctly, car colliders account for graphics offset, new physics.Collider.Track() allowing to check for collisions with the track;
- New ac.getCollidingShapesContacts() returning actual contact points;
- New argument for coroutine.create() for flags: raise errors, start coroutine immediately;
- New insideCar:yes, actsAsLED:yes and actsAsAnalogInstrument:yes queries Scene API;
- Functions raycasting physics geometry got an argument for taking procedural noise into account;
- New coroutine.sleep();
- Coroutines support improved (please report any malfunctioning functions).
- Shared libraries:
- New shared/promise with a custom fast JS-like Promises implementation;
- New shared/utils/ntp library for querying precise time using NTP protocol (can help with syncing for alternative online modes);
- New shared/utils/luasteam for full access to Steam API available to all scripts with I/O access (forked version of luasteam with a few more functions and a bunch of small fixes);
- New shared/utils/parcel for exchanging small bits of data;
- New surfaces.raycastDetailed() in shared/sim/surfaces;
- shared/utils/signing: new signing.check(), new {CSPVersion}, {CSPVersionCode} and {UniqueMachineKeyBase64Trimmed} for signing format string, queries to quickly and easily verify integrity of cars and tracks, as well as AC’s “surfaces.ini”, verify function can handle absolute paths, other fixes;
- shared/sim/fireworks library is more responsive.
- Render API:
- New main.smoke render event for render.on();
- render.circle() and others: argument for white reference point brightness correction.
- I/O API:
- New io.compress() and field compress for io.extractFromZipAsync() for applying NTFS compression, remote_assets files are compressed by default;
- io. functions accessing file times (such as io.lastAccessTime()) can be used to change file times as well now.
- UI API:
- Horizontal thin scrollbars (new argument for the function, or, you can use bit.bor(ui.WindowFlags.HorizontalScrollbar, ui.WindowFlags.ThinScrollbar) for a window with horizontal scrollbar);
- ui.progressBar(): pass math.nan for progress for indeterminate progress bar;
- :linkToSimulationSpeed() of GIF players fixed;
- Using ui.unloadImage() now lets CSP unload “dynamic::hud::redirected::N” buffers if unused.
- Gameplay API (available to apps, online scripts and more):
- New ac.resetDynamicTrackObjects() in Gameplay API allowing to reset dynamic track objects;
- New :redirectLayer2() returning duplicate flag as well, :redirectLayer() is deprecated;
- ui.registerOnlineExtra(): argument to set a tooltip message.
- Game API (available to apps and New Mode scripts only):
- New ac.setTrackCoordinatesDeg2() (ac.setTrackCoordinatesDeg() is mixing up X and Y of coordinates);
- New ac.debugTrackColliders().
- Lua apps:
- New ac.sendKeyboardButtonEvent();
- ac.getSetupSpinners(): new visible field;
- New ac.getSetupTabs().
- New Modes:
- New experimental ac.overrideSession();
- New [TWEAKS] ALT_ONLINE_CARS=<number> adding extra “remote” cars that can be driven by the script, with a new shared/sim/altonline library to control them, as well as other values allowing to create proper custom online modes and more, see “p2p-1v1” for an example;
- New [TWEAKS] DYNAMIC_TRACK_OBJECTS_SEED overriding random seed used for arranging track objects;
- Add [TWEAKS] VERIFY_STEAM_API=1 for CSP to check if Steam is actually available at the launch;
- Manifests of New Mode scripts can use INIpp features, allowing to do things like activating tweaks based on “race.ini” or “settings.ini”;
- Scripts can access ac.startBackgroundWorker().
- Physics API:
- New physics.setPenalties(), physics.setWrongWayPenalty() and corresponding state fields in ac.getSim() (also, .allowedTyresOut updates live properly);
- New physics.setAssists() and ac.onAssistsChanged(), physics.setAssists() can also be used to block out assists editing;
- physics.RigidBody(): alignment of debug outlines for cylinders and capsules is fixed as well;
- physics.overrideRacingFlag() works better if called every frame;
- New physics.getTrackObjectStatus(), physics.getTrackObjectPointVelocity() and physics.addTrackObjectForce() for physics workers;
- Enabling AI for cars online fixed;
- Logic for laps invalidation caused by usage of these functions slightly improved, invalidating less often, no longer invalidating when applying to AIs in offline races.
- Car physics scripts:
- New ac.addCosmicForce() and ac.addCosmicTorque() for adding forces to cosmic suspension;
- Physics debug lines: brightness fixed, .mult of rgbm is taken into account, option to draw a dashed line.
- Other script-related changes:
- Lua profiler updated, cleaner and more informative, no longer freezes AC;
- Lua Debug app: texture viewer no longer conflicts with Objects Inspector, graphs for ac.debug() with number adjusted;
- Calling script.asyncUpdate() is temporarily disabled until I figure out why it explodes at the start once in a dozen of runs;
- Docs for states fixed, 0-based arrays use custom tables instead of array syntax to improve compatibility with Lua Language Server plugin;
- Some of LuaJIT functions, especially the ones returning complex entities like INI files, should be faster;
- New Python function ac.ext_isLapInvalidated().