Release 105-861
Release 105-861
The changelog since the fork until release 105-861, which happened in February 2022.
Caveats
wupget:GameProgressinterval 10 → 5 seconds- basecontent now provides the 
treetype0totreetype15features with a model and some customparams - buildings can be placed inside other buildings’ open yardmap gaps
 - demos are saved with UTC clock filename (could break filename parsing etc)
 
Features and fixes
Icons as UI
- new springsetting 
UnitIconsAsUIand an ingame/iconsAsUIcommand (all below have a/commandvariant without the “Unit”). Set to 1 to make radar icons behave like UI elements instead of in-world objects (e.g. no obscuring by terrain, distance fog, blurring or reflection in the water etc. - new springsetting 
UnitIconScaleUI. Size scaling for icons when drawn as UI. - new springsetting 
UnitIconsHideWithUI. Whether icons get hidden via F5. - new springsettings 
UnitIconFadeStartandUnitIconFadeVanish, for making icons fade smoothly 
Grass
Spring.{Add,Get,Remove}Grassnow works even if grass rendering is disabled (also fixes desync)Spring.AddGrassnow has a 3rd param, grass intensity (returned byGet; putting 0 equivalent to usingRemove)
Recursion
Allow shallow recursion (up to 16 calls deep) for the following callouts/callins:
Spring.{Create,Destroy}{Unit,Feature}Spring.GiveOrder{,Array}ToUnit{,Array,Map}
Additionally:
Spring.SpawnExplosionworks insideProjectile{Created,Destroyed}
Texture Atlases
- add 
gl.CreateTextureAtlas(number x, number y, number? allocType, string? atlasName) → string texName.xandyhave to be between 256 and the value of the springsettingMaxTextureAtlasSizeX(Y respectively).allocTypedefaults to 0 if not specified.atlasNameis an optional name for the atlas. - add 
gl.FinalizeTextureAtlas(string id) → bool success. - add 
gl.DeleteTextureAtlas(string id) → bool success. - add 
gl.AddAtlasTexture(string id, string luaTex, string? subAtlasTexName). Adds textureluaTexStrto sub-atlassubAtlasTextureName(defaulting to same name asluaTexif not specified) of atlasid. The lua tex has to be a regular 2D RGBA/UNORM texture. DDS textures can also be put into the atlas. - add 
gl.GetAtlasTexture(string texName, string luaTex) → number s, p, t, q. Query an atlas texture for the UV coordinates (minU, maxU, minV, maxV) of a texture saved earlier withSpring.AddAtlasTexture. 
Particles
- CEGs from allied projectiles now visible in the fog
 - add 
/softParticlestoggle andSoftParticlesspringsetting to make particles (esp. groundflashes) clipping into the ground fade a bit instead of having a jagged edge - add 
Spring.SetNanoProjectileParams(r, v, a, randR, randV, randA) → nil. All params are numbers, and default to 0 when not given. The first three are starting rotation in °, rotation speed in °/s, and rotation acceleration in °/s². The other three are the same but multiplied with a random (-1; +1) before being added to the former, rolled once per particle at the start of its lifetime. - add 
Spring.GetNanoProjectileParams() → r, v, a, randR, randV, randA, returns the parameters as above. - add 
/drawOrderParticlescommand which makes particles obey draw order, supplied in CEG definition under thedrawOrderkey - add 
rotParamskey toCSimpleParticleSystemandCBitmapMuzzleFlameCEGs, a vector of 3 floats: rotation speed °/s, rotation acceleration °/s², starting rotation in ° 
Advanced GL4 (shaders, VAO, etc)
- add 
gl.GetVAOwhich returns an object with a bunch of methods. - add 
gl.GetVBO. - add 
Spring.GetSelectedUnitsCountto the shader container (use case: F2 pathmap replacement, can show a general slope map if 0 units selected) - add 
gl.{Unit,Feature}{,Shape}GL4temporary functions - added a ton of uniforms for shaders
 - add LuaShaders::Set{Unit,Feature}BufferUniforms for GPU side per unit/feature “uniforms” (SSBO in fact)
 - gl.Uniform/gl.UniformInt/etc don’t require location as a first param, name is fine too.
 
Lua constants for rendering
- add 
Platform.glHave{AMD,NVidia,Intel,GLSL,GL4}bools - remove 
Platform.glSupport24bitDepthBufferand addPlatform.glSupportDepthBufferBitDepthinstead - add the following constants to 
GL:LINE_STRIP_ADJACENCY,LINES_ADJACENCY,TRIANGLE_STRIP_ADJACENCY,TRIANGLES_ADJACENCY,PATCHES - add the following constants to 
GL:[UNSIGNED_]BYTE,[UNSIGNED_]SHORT,[UNSIGNED_]INT[_VEC4],FLOAT[_VEC4],FLOAT_MAT4 - add the following constants to 
GL:ELEMENT_ARRAY_BUFFER,ARRAY_BUFFER,UNIFORM_BUFFER,SHADER_STORAGE_BUFFER - add the following constants to 
GL:READ_ONLY,WRITE_ONLY,READ_WRITE - add a ton of image type specifiers (
RGBA32etc) toGL - add a ton of barrier bit constants to 
GL 
Other rendering-adjacent stuff
- most CEGs and weapon visuals are tested for texture validity such that sprites with invalid textures are not displayed. No more need for 1x1 empty texture
 - fix skybox stretching and seams (in case it’s represented by a cubemap)
 - smoother area-command circle, vertices 20 → 100
 - add 
Spring.{Set,Get}{Unit,Feature}AlwaysUpdateMatrixwhich makes the unit “always update matrix” - add 
/reloadTextures [lua, smf, s3o, ceg]to reload textures, all groups if none specified. - filling the nano wireframe works on the current model heights (meaning units with pieces hidden high above but moved downward work correctly)
 - add 
globalRenderingInfo.availableVideoModes - add 
gl.GetFixedStatethat returns a bunch of various GL constants and tables, it does a lot depending on args. DeprecatedGLWarnLevelspringsetting default value 2 → 0 (to reduce spam)- add 
gl.AlphaToCoverage(bool enable, bool? force) → nil, defined only ifGLEW_ARB_multisampleis supported by the platform, and otherwise the func itself is nil;forcemakes it apply even if MSAA level is under 4 - improve AMD gfx card detection (looks for more strings, eg. “radeon”, and in more places)
 - add 
gl.ClipDistance(number clipID, bool enabled) → nil,clipIDis 1 or 2. - change 
TextureMemPoolSizespringsetting default value 256 → 512 MB - expose 
windSpeedtoSpring.{Get,Set}WaterParams - new bumpwater params (defaults): waveOffsetFactor (0.0), waveLength (0.15), waveFoamDistortion (0.05), waveFoamIntensity (0.5), causticsResolution (75.0), causticsStrength (0.08)
 - fix sky reflections on the ground (
skyReflectModTex) 
Missile smoke trails
- weapon defs: add bool 
smokeTrailCastShadow, numbersmokePeriod(default 8), numbersmokeTime(default 60), numbersmokeSize(default 7), and numbersmokeColor(default 0.7, single value for all three RGB channels tint) to things with smoke trails - weapon defs: add bool 
castShadow, for the projectile itself 
Camera tweaks
- add integer springsetting 
SmoothTimeOffset. This attempts to smooth out the TimeOffset parameter that is used to calculated the tweened draw frames. Default 0, old behaviour. Recommended value of 2, this attempts to keep the actual timeoffset within 90% of the true time. Best with vsync on. - add boolean springsetting 
CamFrameTimeCorrection. Default false is the current behaviour, use true to get better interpolation during high load. 
Builders
- new yardmap options for “stacked” buildings
 - add 
Spring.{Set,Get}UnitBuildParams(unitID, "buildDistance"/"buildRange3D", value) → nilabout unit build range (number) and whether it’s spherical (bool) - add 
Spring.GetUnitInBuildStance(unitID) → bool - add the 
gadget:AllowUnitCaptureStep(capturerID, capturerTeamID, victimID, victimTeamID, progressDiff) → boolcallin - fix seaplanes being unbuildable on water if they were set to float rather than submerge
 
Other additions to Lua API
math.random()now correctly accepts arguments when parsing defs- allow 
nilas the first arg toSpring.SetCameraState Spring.SetWMIconnew 2nd arg, boolforce: ignores the 32x32 icon restriction on Windows- allow empty argument for 
Spring.GetKeyBindingsto return all keybindings - add 
Spring.GetUnitsInScreenRectangle - added 
Spring.SetWindowGeometryfor easy window positioning. - add 
Spring.ForceTesselationUpdate(bool normalMesh = true, bool shadowMesh = false) → bool isROAMfor ROAM - parameterless 
Spring.GetUnitFlanking()now has an 8th return value, collected flanking bonus mobility 
Misc features
- selection keys: add an 
IdMatchesfilter to use the internal name - the default pathfinder (set via 0 in modrules) is now multi-threaded. In release 861, the old single-threaded pathfinder is temporarily accessible by setting the modrule to 2, but this gets removed later on in release 1544 when MT issues are fixed.
 - add 
/setSpeed xto set game speed directly, still obeys min/max - add 
/endGraph 2to bring the player back to the menu (1 still quits) - keybinds: same action with different arguments now differentiated
 - added a Load Game button to the raw spring.exe menu
 - command cache increased 1024 → 2048
 - native AI interface: add 
Feature_getResurrectDefandFeature_getBuildingFacing - native AI interface: add 
sphericalparam toGet{Friendly,Enemy,Neutral,}{Units,Features}{In,} 
Misc fixes
- fix CEGs from allied projectiles: now visible in the fog
 - fix disk read failures (files that get read failure errors are retried multiple times before giving up)
 - fix enabling globallos not revealing unseen terrain changes immediately
 - fix height bounds calculation, it now reflects the actual heights rather than the historical min/max (for example if the highest point went 100 → 90 → 110 → 100, previously 
Spring.GetGroundExtremeswould return 100 → 100 → 110 → 110) - fix 
Spring.SpawnExplosioncrashing on some valid data - fixed aircraft using smoothmesh to update if terrain was modified pre-game
 - multiple fixes to save/load
 - fix spring-dedicated not correctly showing output on Windows when not redirected (spring-headless already worked correctly)
 - fix a crash when trying to add enemy units to a control group (e.g. selected via /godmode)
 - fix a desync caused by locale-dependent string sorting
 - fix a crash trying to load a save done on a map with LuaGaia when currently playing on a map without it
 - fix resources sometimes getting into the negative (on the order of 1e-15) due to float inaccuracies; in particular this caused units that cost 0 resources to shoot to be unable to fire due to insufficient resources
 - fix “zombie torpedoes” bouncing under the map
 - fix projectiles going through units sometimes
 - fix the “unload dead unit” synced crash
 - probably works on Linux Wayland (implementation doesn’t support hardware cursor yet; added in a later release)