/
changelog.txt
6875 lines (6169 loc) · 351 KB
/
changelog.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Spring changelog
(since 85.0 a "!" prefix indicates backward compatibility broke)
(numbers in brackets normally mean the mantis ticket ID)
-- 105.0 --------------------------------------------------------
Sim:
- allow resurrecting indestructable features
- consider partially reclaimed wrecks nonfresh for area-resurrection commands
! remove undocumented BeamLaser range modifier (provided 30% extra when fired by mobile units)
! remove legacy (COB, though also affecting Lua) hack allowing units with onlyForward weapons to fire regardless of AimWeapon status
! remove CMD_SET_WANTED_MAX_SPEED
- allow CEG trails for crashing aircraft (engine will randomly select from any generators listed in sfxTypes.crashExplosionGenerators)
- DGun weapontype: allow leading (leadLimit for DGun defaults to 0 instead of -1 for back-compatibility)
- Rifle weapontype: obey collision flags
- change default ownerExpAccWeight to 0 for all weapon-types
- remove salvoError multiplier hack for positional and out-of-los targets
- add new UnitDef tag "stopToAttack"
Lua:
- add math.tau
- add sensors.decloakRequiresLineOfSight modrule. If true, sight radius works as a cap for decloak radius
(for example a unit with decloak radius 200 will not be decloaked with a 100 LoS unit in the 100-200 range,
and units with 0 LoS can't decloak others at all regardless of decloak range). Defaults to false.
- add Platform.osVersion; complements Platform.osName
- add Platform.hwConfig
- Script.IsEngineMinVersion now available in all Lua parsing contexts,
most importantly in `defs.lua`
! change {Allow,Unit}Command callin parameters
AllowCommand(..., cmdTag, fromSynced) --> AllowCommand(..., cmdTag, playerID, fromSynced, fromLua)
UnitCommand(..., cmdTag ) --> UnitCommand(..., cmdTag, playerID, fromSynced, fromLua)
! remove Game.mapHumanName
! remove UnitDefs[i].moveDef.{family,type}
- LuaUI now has access to Spring.SetUnitNo{Draw,Select,Minimap} and SetFeatureNoDraw
- let Spring.SelectUnitArray select enemy units with godmode enabled
- let Unit*Collision callins skip engine collision handling if true is returned (from any synced gadget)
- call gadgetHandler:Explosion for unsynced gadgets (but discard the return value)
- allow specifying source by position but target by ID for Spring.GetUnitWeaponHaveFreeLineOfFire
- allow setting terrain-type hardness and name via Spring.SetTerrainTypeData
! add extra boolean return-value to Spring.GetPlayerInfo between 'rank' (#9) and 'customPlayerKeys' (#11)
select(10, Spring.GetPlayerInfo(player)) is now equal to select(4, Spring.GetTeamInfo(player.team))
! return the terrain-type index from Spring.GetGroundInfo and Spring.GetTerrainTypeData
these functions now push [number index, string name, ...] rather than [string name, ...]
onto the stack
! change DefaultCommand call order
previously widgets were called first, and if they returned anything, gadgets weren't called at all
now gadgets are called first, then widgets are always called and can override
- add a 3rd param to DefaultCommand callin: the current default command
works with the above: gadgets receive the default engine cmd,
widgets then receive what gadgets returned (possibly engine default)
- add Spring.ClosestBuildPos(teamID, unitdefID, worldx,worldy,worldz, searchRadius, minDistance, buildFacing) -> buildx,buildy,buildz to LuaSyncedRead
- add Spring.GetGlobalLos(allyTeamID) -> bool to LuaSyncedRead
- add Spring.IsNoCostEnabled() -> bool to LuaSyncedRead
- add Spring.SetWind(number minStrength, number maxStrength)
- add Spring.SetTidal(number strength)
- add Spring.GetTidal
- add Spring.GetGameState() -> bool, bool, bool, bool to LuaUnsyncedRead
1) finished loading
2) loaded from a save
3) locally paused (i.e. after entering /pause)
4) lagging wrt expected simframe time
- add Spring.SetUnitUseWeapons(unitID, bool force, bool block), only one of the bools should be true
setting force to true means the unit can fire even when being dead, stunned, a nanoframe, or in build stance
setting block to true means the unit can't fire at all (unless "force" which takes priority)
- add Spring.Set{Unit,Feature}PieceVisible(unit/featureID, pieceID, bool visible)
- add Spring.{Unit,Feature}Rendering.SetProjectileLuaDraw
- add Spring.{Unit,Feature}Rendering.Set{Deferred,Forward}MaterialUniform
- add Spring.{Unit,Feature}Rendering.Clear{Deferred,Forward}MaterialUniform
- add Spring.AddObjectDecal
! rename Spring.RemoveBuildingDecal to Spring.RemoveObjectDecal
- add Spring.GetLuaMemUsage to LuaUnsyncedRead and LuaMenu
returns the number of (kilo-)bytes used and (kilo-)allocations performed
by the calling Lua state individually, as well as by all states globally
- add Spring.GetVidMemUsage to LuaUnsyncedRead
- add Spring.Get{Unit,Feature}PieceTransformMatrices to LuaUnsyncedRead
- add Spring.Ping callout and corresponding Pong callin
- add Spring.GetMapStartPositions callout
- add gl.GetViewRange callout
- add gl.GetScreenViewTrans callout
- add gl.GetScreen{View,Proj}Matrix callouts for legacy compatibility
- add DrawMaterial callin
- add DrawSky and DrawSun callins; available when a map has no skybox defined
- add DrawWater callin
- add DrawGrass callin (enabled by /drawgrass 2; supersedes engine rendering)
- add DrawTrees callin (enabled by /drawtrees 2; supersedes engine rendering)
- make gl.Feature{Raw} able to draw default trees
if drawing multiple trees in a row, use gl.Feature(treeID, true, false)
for the *first* tree and gl.Feature(treeID, false, true) for the *last*
[more efficient; call gl.Feature(treeID, true, true) to render a single
tree with default state]
! remove the $specular named texture
! remove gl.Light, gl.Lighting, gl.Material, gl.ShadeModel
! remove gl.Fog, gl.FogCoord, gl.SecondaryColor
! remove gl.PointSize, gl.PointSprite, gl.PointParameter
! remove gl.TexEnv, gl.MultiTexEnv, gl.TexGen, gl.MultiTexGen, gl.MultiTexCoord
! remove gl.CreateList, gl.CallList, gl.DeleteList
! remove gl.DrawListAtUnit
! remove gl.Shape
! remove gl.EdgeFlag
! remove gl.GetGlobalTex{Names,Coords}
! remove gl.LineStipple
! remove gl.LineWidth
! remove gl.AlphaTest
! remove gl.ClipPlane
! remove {Unit,Feature}Rendering.{SetPieceList,SetMaterialDisplayLists}
! remove LuaMaterial {pre,post}list handling
! remove 'useCamera' LuaMaterial parameter
! remove 'identities' gl.ActiveFBO argument
- add gl.ClipDist(number index, boolean enable) -> nil
- add gl.{Create,Delete,Update,Render}VertexArray
gl.CreateVertexArray(number vertexCount, number indexCount) -> number id | nil
gl.DeleteVertexArray(number id) -> boolean success | nil
gl.UpdateVertexArray(number id, number vertexPos, number indexPos, table vertexData | function updateFunc [, args...]) -> boolean success | nil
gl.RenderVertexArray(number id) -> boolean success | nil
- add gl.GetDefaultShaderSources(string shaderName) -> table | nil
shaderName can be one of {"0", "C", "T", "T4", "TN", "TC", "2D0", "2DT"}
table contains vertex/fragment/... source strings for the respective engine
shader used internally to draw UI elements, etc ("0" means the given shader
only receives position attributes, "C" means it receives colors, "T" means
it receives texture coors, "N" means it receives normals, and "XY" means it
receives X and Y)
- add `VFS.GAME` as a synonym to `VFS.MOD`
- support local-space tracking for dynamic lights added via Spring.Add{Map,Model}Light
the light-definition table should contain a 'localSpace = true' entry to enable this
- move GetConfig* to LuaUnsyncedRead
- Add Spring.SetVideoCapturingTimeOffset() for > 30fps video capturing
- default `defs.lua` now reads a new file, `defs_post.lua`, which
currently filters out movedefs unused by any unitdef (previously
this was done by the engine). You can prevent this filter by adding
the `dont_remove` field to such movedefs. This is useful to make
them available in `Spring.MoveCtrl.SetMoveDef` but beware the perf cost.
- new TextEditing(utf8, start, length) callin, which holds the IME editing composition (https://wiki.libsdl.org/Tutorials/TextInput)
- new SDLSetTextInputRect(x, y, w, h), SDLStartTextInput() and SDLStopTextInput() functions for controlling IME input from Lua
- Add AllowUnitTransport callin. Called when the engine tests whether unit A can transport unit B. Returning true will let
the engine decide, returning false will force the engine to disallow transportation (for this specific call).
- add AllowUnitTransport{Load,Unload} callins for controlling whether unit A can start {un}loading unit B
- add AllowUnit{Cloak,Decloak} callins for controlling whether a unit can become {de}cloaked
- new unit rules param access level, 'typed': between 'inlos' and 'inradar', applicable when the unit has once been in LoS
and continuously in radar since (same rule as `GetUnitLosState(x).typed` and typed engine icons)
- the GiveOrder* family of callouts can now accept a number for command params,
equivalent to providing an array with one member (use it to save on arrays)
- MarkerAdd{Point,Line} now have an extra optional argument (after localOnly: 6th for point, 8th for line):
the playerID of the player who should appear as the author of the drawing (if missing, defaults to the local player).
Only has an effect when localOnly is true.
- add `paralyze.paralyzeDeclineRate` to modinfo, controls how many seconds it takes for EMP to decline by 100%%
- expose `Game.paralyzeDeclineRate` and `Game.paralyzeOnMaxHealth`
- Added tesselation shaders support to gl.CreateShader. New stages have "tcs" and "tes" names and defined similarly to existing
"fragment", "vertex", "compute" stages. Also added gl.SetTesselationShaderParameter to define tesselation parameters from OpenGL
host.
- Added support for Subroutine Uniform (gl.UniformSubroutine, gl.GetSubroutineIndex)
- Added a few OpenGL constants:
1) shader types GL.VERTEX_SHADER, GL.TESS_CONTROL_SHADER, GL.TESS_EVALUATION_SHADER, GL.GEOMETRY_SHADER_EXT, GL.FRAGMENT_SHADER.
They are mostly useful as one of the arguments to the new Lua gl.UniformSubroutine and gl.GetSubroutineIndex callouts.
2) geometry shader parameter types GL.GEOMETRY_INPUT_TYPE_EXT, GL.GEOMETRY_OUTPUT_TYPE_EXT, GL.GEOMETRY_VERTICES_OUT_EXT.
These are used in SetGeometryShaderParameter callout (formerly known as SetShaderParameter)
3) tesselation shader parameter types GL.PATCH_VERTICES, GL.PATCH_DEFAULT_OUTER_LEVEL, GL.PATCH_DEFAULT_INNER_LEVEL.
The first is mandatory for tesselation to work, the other two are optional and can be used on the OpenGL host side instead of
writing the tesselation control shader.
4) New vertex primitive type GL.PATCHES
! Renamed SetShaderParameter to SetGeometryShaderParameter to avoid confusion
- add font:World{Begin,End,Print} callouts
- add font:SetText{View,Proj}Matrix callouts
- Added VFS.GetLoadedArchives() -> { string archiveName1, string archiveName2 ... }
- Added VFS.GetArchivePath(string archiveName1) -> string archivePathOnDisk
- Added VFS.GetFileAbsolutePath(string vfsFilePath) -> string filePathOnDisk
- Added VFS.GetArchiveContainingFile(string vfsFilePath) -> string archiveName
! VFS.MapArchive, VFS.UnmapArchive and VFS.UseArchive now take archiveName instead of fileName as the first parameter.
- add a 6th return value (feature->reclaimTime) to GetFeatureResources.
- Add `Spring.UnitFinishCommand(unitID)`, finishes current command. Unlike CMD.REMOVE it works with Repeat/UnitCmdDone
and unlike CommandFallback it works on builtin engine commands.
- Allow spawning of any CEG from any LUS:
EmitSfx(p, "cegTag") param will emit the CEG with tag="cegTag"
EmitSfx(p, SFX.GLOBAL | cegID) will emit the CEG with id=cegID
Added Spring.GetCEGID("cegTag") to get CEG id from tag
- Added Spring.GetUnitCurrentCommand(unitID [, cmdIndex]) -> [cmdID, cmdOpts (coded), cmdTag[, cmdParam1[, cmdParam2 ... ]]]
Returns the index-th command in the unit's queue (or nil). Note: cmdOpts are represented by a single number
(usually a table otherwise), and params are returned on the stack as well. This function allocates no tables.
! make Spring.Get{Unit,Factory}Commands always expect a second argument
! Spring.GetTeamInfo: switched the last two return values around (incomeMultiplier is now 7th, customKeys is now 8th)
- Added a second boolean parameter to Spring.Get{Player,Team}Info, if it is false the function will not return
the (now) last return value, the customKeys table (allocation optimisation)
! Spring.GetUnit{Armored,IsActive} now works on enemies in LoS
! Spring.GetUnitMass no longer works on enemies outside of LoS
! remove Spring.{Set,Get}UnitTravel
! remove Spring.SetUnitToFeature (use the AllowFeatureCreation callin to block features from being spawned)
- Added a boolean parameter to Spring.GetCameraState, if set to false it will return the current camera name
and then the following camera-specific values on the stack:
fps, rot -> oldHeight
ta -> height, angle, flipped
spring -> rx, ry, rz, dist
free -> rx, ry, rz, vx, vy, vz, avx, avy, avz
ov -> (nil)
- Spring.SetUnitWeaponState with "autoTargetRangeBoost" now also lets Cannon
and StarburstLauncher weapons look ahead and pre-aim at targets just
outside of nominal range.
AI:
- reveal unit's captureProgress, buildProgress and paralyzeDamage params through
skirmishAiCallback_Unit_get{CaptureProgress,BuildProgress,ParalyzeDamage} functions
Misc:
- dedicated server now defaults the `AllowSpectatorJoin` springsetting to false (still true for non-dedi)
- Rifle weapontype: remove hardcoded particles
- add MapConvNG executables to official spring builds: https://springrts.com/wiki/MapConvNG
- remove joystick support
- detect hangs during filesystem initialisation
- fix stale thread-id cache in watchdog after reload
- make LuaVFSDownload rescan archives in main thread, and do so when a download finishes (not when one starts)
- account for raw search in AICallback::GetPathLength
- use hidden window for offscreen context rendering
- add /hang command
- add /luagccontrol command
- add /netping command
- add /netmsgsmoothing command
- add /distsortprojectiles command
- add /{more,less}grass and /drawgrass commands
- remove Basic{Sky,Water,TreeDrawer} (3DTrees is now always 1)
- remove /DynamicSky command and keybinding
- remove /{More,Less}Clouds commands
- remove 3DTrees config-setting
- remove /adv{map,model}shading commands
- remove Adv{Map,Unit}Shading config-settings
- remove ForceDisableShaders config-setting
- remove Use{V,P}BO config-settings
- remove LuaShaders config-setting
- remove legacy InfoTexHandler
- mandate GLSL support
- throw out legacy load-screen code (replaced by LuaIntro)
- change PitchAdjust config-setting from a boolean to an integer
0 disables, 1 scales pitch by the square root of game speed, 2
scales linearly with game speed
- `/nocost` now accepts 0/1 parameter (still toggles if none given)
- model metadata for assimp/obj can now define pieces hierarchy
by either nested tables or 'parent' key.
- IME editing support for those with the proper SDL2 version/IME tool combination
! Made lockluaui.txt obsolete: no longer necessary for it to exists in order to enable VFS for LuaUI
- use SHA2 rather than CRC32 content hashes
Fixes:
- fix #1968 (units not moving in direction of next queued [build-]command if current order blocked)
- fix #6060 (Max{Nano}Particles=0 still allowing 1 {nano}particle to spawn)
- fix #6059 (units with high turnRate/brakeRate/acceleration moving unexpectedly)
- fix #4268 (add Spring.AddObjectDecal)
- fix #4755 (wrong usage of addr2line on FreeBSD)
- fix #4945 (add Spring.GetMapStartPositions)
- fix #4724 (Spring.SetUnitNeutral not informing any attackers)
- fix #5864 (gunships not limited by maxVelocity when colliding with terrain)
- fix #4515 (aircraft jitter when moving and turning)
- fix #6048 (falling features shaking on the ground instead of fully stopping)
- fix #6046 #5326 #5222 #4663 (spurious camera position change if entering MMB mode while moving cursor)
- fix #6019 (Spring.IsAABBInView bug)
- fix #6038 (noExplode weapons not obeying SetUnitWeaponState("range"))
- fix #6036 (no method to detect MMB camera-pan mode)
- fix #5956 (inverted mouse camera panning for Windows 10 Pro users)
- fix #6022 (uniformArray not initializing array-uniforms in gl.CreateShader)
- fix #6012 (air-transports not unloading properly)
- fix #6010 (HoverAirMoveType aircraft ignoring smooth-mesh when idle)
- fix #6009 (aircraft landing on damage-dealing water when idle)
- fix #6007 / #5989 (desyncs on CMD_UNLOAD_UNITS)
- fix #5993 (voidwater triggering water explosion effects)
- fix #5247 (maximized minimap producing graphical glitches)
- fix #5962 (minimap viewport rectangle larger than what actual screen shows)
- fix #5965
- fix #5977 (log-system memory corruption)
- fix #5964 (shields occasionally letting projectiles pass)
- fix #5948 (memory corruption with LoadingMT=1)
- fix #5947 (PFS failure if starting square inside concave corner)
- fix #5934 (crash on malformed build-commands)
- fix #5923 (wrong external format passed to gl{BuildMipmaps,TexImage2D})
- fix #5927 (memory corruption in text-wrapping)
- fix #2127 (units chasing after full transports)
- fix #4972 (builders doing redundant movement to clear build-sites)
- fix #5207 (units not following waypoints)
- fix #2354 (Spring.GetUnitWeaponState not matching Spring.SetUnitWeaponState due to experience)
- fix #5841 (allow setting colour of area selection for custom commands)
- fix #5884 (treat collidee as attacker on unit <-> unit collisions for UnitPreDamaged)
- fix #5716 (add Weapon::{avoid,collision}Flags to Spring.{Get,Set}UnitWeaponState)
- fix #5652 (maneuverBlockTime aircraft control parameter)
- fix #1225 (inaccurate preview range-rings)
- fix #5870 (zero-based months in rotating infolog filenames)
- fix #5862 (Spring.DestroyUnit + Spring.CreateUnit not supporting persistent ID's)
- fix #5860 (units failing to aim uphill at targets near cliff edges)
- fix #5863 (too strict matrix orthonormality check)
- fix #5855 (memory corruption when loading models)
- fix #5852 (units chasing after auto-generated targets going out of range even on hold-pos)
- fix #5854 (broken default formation-move visualization)
- fix #5851 (DynamicWater crash if foamTexture specified as .dds file)
- fix #5850 (squished loadscreens with BumpWater enabled)
- fix #5806 (CEG spikes from underwater explosions drawn on water surface)
- fix #5820 (broken by 3bd78acb00cab732af4278ed324c7ee5dbc7c517)
- fix #5805 (broken water reflections in FPS camera mode)
- fix infinite backtracking loop in PFS
- fix #5814 (broken slopemap indexing for terrain buildability tests)
- fix #5803 (move goals cancelled when issued onto blocked terrain)
- fix Spring.{G,S}etConfigFloat not being callable
- fix Spring.GetPlayerRoster sometimes excluding active players
-- 104.0 --------------------------------------------------------
Major:
- Add LuaMenu - an unsynced stripped down Lua environment that starts before the game is loaded and persists through reload
this environment receives the Draw{Genesis,Screen,ScreenPost} callins as well as
a special AllowDraw FPS limiter which enables these if true is returned from it
(otherwise they are called once every 30 seconds)
! make GL3.0 the minimum required OpenGL version; Intel G45's and other relics are now banned
(any driver that claims support for this *and* shaders is allowed to run Spring unimpeded)
- improve memory management so Spring.Reload can be safely called multiple times in a row
- kill various desyncs that slipped into 103.0
Misc:
- Assorted bugfixes and optimisations
- force regeneration of ArchiveCache
- Implement VFS modes - VFS.MOD, VFS.MAP & VFS.BASE now actually work. Added VFS.MENU
! base archives now have modtype of 4 and menu archive have modtype of 5
! one letter command-line flags (e.g. -g instead of --game) are removed
- generally more detailed error-logging
- continued internal cleanup and C++11 adoption to reduce unnecessary data copying and allocing
- don't load-then-immediately-free the LuaGaia handler if neither (synced or unsynced) entrypoint exists
- don't record non-essential profile data in the background if not in /debug mode; reset profiler on reload
- replace dozens of STL containers with faster custom alternatives
- use pooled memory allocations in several engine components
- make Use{V,P}BO=0 reuse buffers when downsized
- recycle audio-stream buffer memory
- recycle demo-streams across reloads
- write demos before destroying game on shutdown in case the latter CTD's
- do not spawn VFS initialization threads if WorkerThreadCount=0
- rebase ThreadPool on a lock-free taskqueue; make IO-bound work unable to block execution of other tasks
- reduce ThreadPool worker-count right after VFS initialization
- asyncify writing screenshots via ThreadPool
- asyncify demo/savegame compression
- disable hang-detection when showing a message box
- defer loading *Def sounds until simulation asks for them
- use pcall in LuaUtils::Echo
- catch all exceptions in Game::Load and make it non-interruptable
- turn LoadDefs content_error exceptions into clean exits
- set modType to an integer (not string) value in base-content modinfo.lua's
- do not auto-add springcontent dependency to non-game "mod" archives
- downgrade non-writeable springsettings.cfg's to a warning
- allow maps to not supply a type-map; one fewer exception to worry about
- improve RNG statistical quality; sampled ints can now also exceed 0x7fff
- make the *nix CrashHandler compile on ARM; do not use cpuid on non-x86 builds
- enable compilation without streflop
- change ForceShaders to ForceDisableShaders (which does the opposite)
- add UseLuaMemPools config-option
- add ForceCoreContext config-option
- add ForceSwapBuffers config-option
- add ForceDisableClipCtrl config-option
- add NETMSG_LOGMSG for synced logging
- netlog Lua memory allocation failures
- netlog model parsing failures
- netlog SHA512 digests over cached path-estimator data
- enforce a minimum of 1GB free disk-space (to prevent cache corruption)
- log 'Warning: Dropping packet from unknown IP' only once per IP
- filter out consecutive duplicated log-messages; add LogRepeatLimit config-option
- fix inverted los-test logic in AI GetProperty callback (patch by rlcevg)
- fix memleak in generated C++ AI interface (patch by rlcevg)
- fix ResourceHandler memleak (patch by rlcevg)
- save SkirmishAI data in separate streams (patch by rlcevg)
- wrecks in water emit bubbles instead of smoke (patch by Sprunk)
- store path-estimator cache files as map.pe-hash.zip; forces a refresh
- delete cached path-estimator data which can not be opened or read successfully
- integrate custom selection volumes; also support subtable-based {col,sel}volume definitions
- refactor the object death-dependency system
- trim unused AssParser root-piece transform overrides;
'rotAxisSigns' and 'rotAxisMap' from 95.0 are also gone
- rip out DynamicSun
much more convincing day / night cycles can be completely and more cleanly
(re-)implemented in Lua with Spring.SetSunLighting, Spring.SetSunDirection,
and Spring.SetAtmosphere
Sim:
! Sonar will now detect ships/hovers - this is since los can't raycast through water.
note that wobble still exists without LoS.
- add 'collideFireBase' weapondef flag
- allow manually sharing nano-frames (patch by Sprunk)
- share unfinished buildees if factory changes team (patch by Sprunk)
- prevent building from dead factories (patch by CommanderSpice)
- restore randomized circling behavior for air-constructors (patch by CommanderSpice)
- UnitExperience is called based on regular exp difference, not limExp (patch by Sprunk)
- set defBaseRadarErrorMult back to 2 instead of 20 (patch by Sprunk)
- expand CEG underground-test lenience from 1 to 20 elmos (patch by Sprunk)
- allow but do not enable staggered LOS updates
- do not hard-assign floatOnWater=true for hovers and ships
checks for this property now first query a unit's MoveDef
(if any) so that ship->tank and similar substitutions via
MoveCtrl.SetMoveDef behave as expected
- disable randomized hovering during CMD_LOAD_UNITS for air-transports
- make Spring.CreateUnit smarter (patch by Sprunk)
if a builderID parameter is passed to Spring.CreateUnit, the new unit
will consider that its solo-builder if it has canBeAssisted=false set
- EMGCannon now obeys flightTime override (patch by Sprunk)
- allow setting runtime/initial firestate to 3 [FIREATNEUTRAL] from COB and unitdefs (patch by Sprunk)
- change a weapon reaiming-tolerance constant from 20 radians to 20 degrees (patch by Sprunk)
- experiment with larger medium-resolution PFS blocksize (16*SQUARE_SIZE vs 8*SQUARE_SIZE)
- bump the default unloadSpread multiplier from 1 to 5
- incorporate native "raw move" (straight-line path) support
inert by default; enable by adding allowRawMovement = true
to a MoveDef table
Lua:
! Undeprecate {unit,feature}def.modelname and add .modeltype and .modelpath to
allow reading these without loading the model. Removed def.model.{name,type,path}
so they aren't used accidentally.
! The callins GameStart and GamePreload won't be called when a saved game is loaded
- Add VFS.AbortDownload(id) - returns whether the download was found&removed from the queue
- Add Spring.Get{Game,Menu}Name to LuaUnsyncedRead, so LuaMenu and unsynced Lua handles know about each other
- Add new callins (LuaMenu only):
ActivateMenu() that is called whenever LuaMenu is on with no game loaded.
ActivateGame() that is called whenever LuaMenu is on with a game loaded.
AllowDraw() if it returns false, the next draw call is skipped (only active when a game isn't running)
- Add Spring.{Set,Get}VideoCapturingMode() - this doesn't actually record the game in any way,
it just regulates the framerate and interpolations.
- add Engine and Platform global tables currently containing the following keys:
Engine.version: string
Engine.versionFull: string
Engine.versionPatchSet: string
Engine.buildFlags: string
Engine.wordSize: number
Platform.gpu: string, full GPU device name
Platform.gpuVendor: string, one of "Nvidia", "Intel", "ATI", "Mesa", "Unknown"
Platform.gpuMemorySize: number, size of total GPU memory in MBs; only available for "Nvidia", (rest are 0)
Platform.glVersionShort: string, major.minor.buildNumber
Platform.glslVersionShort: string, major.minor
Platform.glVersion: string, full version
Platform.glVendor: string
Platform.glRenderer: string
Platform.glslVersion: string, full version
Platform.glewVersion: string
Platform.sdlVersionCompiledMajor: number
Platform.sdlVersionCompiledMinor: number
Platform.sdlVersionCompiledPatch: number
Platform.sdlVersionLinkedMajor: number
Platform.sdlVersionLinkedMinor: number
Platform.sdlVersionLinkedPatch: number
Platform.glSupportNonPowerOfTwoTex: boolean
Platform.glSupportTextureQueryLOD: boolean
Platform.glSupport24bitDepthBuffer: boolean
Platform.glSupportRestartPrimitive: boolean
Platform.glSupportClipSpaceControl: boolean
Platform.glSupportFragDepthLayout: boolean
Platform.osName: string, full name of the OS
Platform.osFamily: string, one of "Windows", "Linux", "MacOSX", "FreeBSD", "Unknown"
! Game.{version,versionFull,versionPatchSet,buildFlags} now reside in the Engine table
Engine.wordSize indicates the build type and is either 32 or 64 (or 0 in synced code)
- Spring.SetWaterParams() can now be used without /cheat for modifying unsynced values.
- Implemented gl.GetWaterRendering() to expose access to water rendering variables.
! Removed water rendering parameters from LuaConstGame, as they're no longer const.
- Added Spring.SetMapRenderingParams() for modifying splatTexMults, splatTexScales, voidWater and voidGround.
- Implemented gl.GetMapRendering() to expose access to the map rendering variables.
! Removed voidWater and voidGround constant parameters from LuaConstGame, as they're no longer const.
- add Spring.{Set,Get}{Unit,Feature}SelectionVolumeData callouts
! remove Spring.SetSunParameters and Spring.SetSunManualControl
! remove gl.Smoothing
- add gl.SwapBuffers callout for LuaMenu
- add Game.envDamageTypes table containing {def}IDs of environmental-damage sources (patch by Sprunk)
- add Spring.{Get,Set}ConfigFloat callouts
- add Spring.{Set,Get}{Unit,Feature}SelectionVolumeData callouts
- add Spring.SpawnExplosion callout
- add Spring.SpawnSFX callout
equal to the *UnitScript versions of EmitSFX, but
takes position and direction arguments (in either
unit- or piece-space) instead of a piece index
- add DrawScreenPost callin (patch by ivand/lhog)
Similar to DrawScreenEffects, this can be used to alter the contents of a
frame after it has been completely rendered (i.e. World, MiniMap, Menu, UI).
- add DrawWorldPreParticles callin
- add start- and hit-position (x,y,z) arguments to ShieldPreDamaged callin
- math.random is now available during execution of defs.lua
(math.randomseed also exists, but will always be a no-op)
- allow gl.BlitFBO blitting from/to the default FB with userdata FBO's
- bump gl.UniformArray length restriction from 32 to 1024
- add Spring.SetFeatureResources(number metal, number energy [, number reclaimTime [, number reclaimLeft]])
- add Spring.SetUnitPieceMatrix(number unitID, number pieceNum, table matrix)
sets the local (i.e. parent-relative) matrix of the given piece if any of the
first three elements are non-zero, and also blocks all script animations from
modifying it until {0, 0, 0} is passed
(matrix should be an array of 16 floats, but is not otherwise sanity-checked)
- add LUS ChangeHeading callin
- add LUS {Start,Stop}Skidding callins; called when a (ground) unit reacts to an impulse
make the start-skidding threshold ('sqSkidSpeedMult') configurable via MoveCtrl.SetGroundMoveTypeData
- make MoveCtrl.Set*MoveTypeData recognize the 'waterline' key (patch by SanguinarioJoe)
- make Spring.ClearUnitGoal cancel raw movement by default
! reorder AllowStartPosition callin parameters and add teamID
old: clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ
new: playerID, teamID, readyState, clampedX, clampedY, clampedZ, rawX, rawY, rawZ
- expose weapon salvo vars to {Get,Set}UnitWeaponState (patch by Sprunk)
- extend Spring.SetFeatureResurrect
old API: arg #2 was parsed as unitdef-name if string
new API: arg #2 is parsed as unitdef-name if string OR unitdef-id if number; arg #4 is parsed as resurrect-progress
- make Spring.SetFeatureResurrect ignore nil for its second arg and allow unsetting the resurrect-target if id=-1
! extend Spring.GetUnitWeaponHaveFreeLineOfFire to take aiming-from coors
old API: Spring.GetUnitWeaponHaveFreeLineOfFire(unitID, weaponNum, targetID | [ tgtPosX [, tgtPosY [, tgtPosZ ]]]])
new API: Spring.GetUnitWeaponHaveFreeLineOfFire(unitID, weaponNum, targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ]]]]]])
(if the srcPos* arguments are all nil, the default aiming location is used as before)
- block getting NoAccessTeam's LoS-state (patch by Sprunk)
- block Spring.GetRadarErrorParams for enemy allyteams (patch by Sprunk)
- implement Path.GetPathNodeCosts
- Spring.GetMouseState now returns a sixth value indicating if the cursor is offscreen
- add Spring.GetGrass(x, y) -> 0|1 to obtain grass map information
! exclude spectators from Spring.GetPlayerList if given a normal (id >= 0) team arg
Rendering
- add new terrain-mesh renderer (faster than existing code, but does not respect cliffs well)
- draw bindpose models non-recursively
- setup alpha-masking for 3DO shadows
- bump ROAM node-pool size for more demanding maps
- limit number of ground-scar decals to 4096
- fix jagged shadows on maps with oblique sun-directions
- fix grass not receiving shadows; unify groundShadowDensity application
- fix grass being rendered black in metal-view
- fix particle shadows
- use clip-control (when possible) to improve depthbuffer precision
- micro-optimize LuaMatBinSet sorting
- make shader-flag handling more lightweight
- do not parse info-textures bound to shaders every single frame
- nuke {point,line}-smoothing options; selected primitive AA is obsolete with multisampling
- outsource vsync regulation to SDL2
UI:
- show a splash-screen while initializing VFS; randomly chosen from any
.png or .jpg images found under SplashScreenDir defined in springsettings.cfg
(if SplashScreenDir is a relative path, Spring's CWD will be prepended)
- Add FPSClampPos config for whether the engine should verify the camera doesn't hit ground/go too far
this and other FPS camera configs can be changed midgame and will affect the next frame drawn.
- Add OverheadMaxHeightFactor config - a float multiplier for maximum overhead camera height.
- skip the IsAbove test/callin for input-receivers when mouse is offscreen
- show warning if VMware Mesa drivers are installed
- avoid "Invalid thread number 0" errors if window creation fails
- rename the 'minimised' CLI flag to 'hidden'
- prevent window from being considered unresponsive during startup
- make shift+esc drop to LuaMenu from PreGame
! fix window-state restoration
the WindowState config-setting is gone, a maximized
non-fullscreen window now gets restored by checking
if the resolution previously written is maximal (for
minimized windows the state is not saved, as before)
- fix VRAM size detection
- coax more information out of systems that fail OpenGL context-creation
- add fallbacks for common context-creation failures; catch inadequate
desktop video-modes; turn exceptions during {window,context}-creation
into friendlier popups
- remove old warnings about junk GPU drivers that can no longer appear
- downgrade from throwing exception to warning for missing scar-textures
- extend and organize the information shown in /debug
! rename '/roam' to '/mapmeshdrawer' which cycles through the renderers
- add '/debugglerrors' command (enables per-frame glGetError reporting)
- add '/debuggl x y z' command (requires DebugGL=1) where x=source,y=type,z=severity
- add '/wire{model,sky,tree,water}' debug commands
! change default bindings for chatswitch* actions
alt+ctrl+(a,a) now toggles chatswitchally
alt+ctrl+(s,s) now toggles chatswitchspec
chatswitchall now has to be bound manually
- allow area commands to be extended off-map
- fix tracking-mode with Free camera
Bugfixes:
- fix LuaParser thread-safety
- fix ProfileDrawer thread-safety
- fix ScopedMtTimer thread-safety
- fix LosMap thread-safety
- fix PathTexture thread-safety
- fix RoamMeshDrawer thread-safety
- fix LuaVFSDownload thread-safety during reload
- fix deadlocks in Windows crash-handler
- fix race-condition between screenshot counter and libIL
- fix sound-thread occasionally accessing a deleted pointer on exit
- fix sound-buffer deletion while buffers were still bound to sources
- fix double-free in CBitmap's move-ctor for DDS images
- fix wrong number of pool-threads being spawned on reload
- fix runaway Text::WrapInPlace string-allocation
- fix FarTextureHandler performance-stalls
- fix potential segfault in SolidObjectDef::GetModelRadius
- fix degenerate GroundFlash quads
- fix ExploSpike projectiles instantly disappearing if they collided with anything on creation
- fix potential gsRNG.Next*() eval-order desync
- fix OOB memory-read in GameSetup::LoadTeams
- fix map-damage explosions being processed twice
- fix explosions causing terraform-spikes on certain maps
- fix UnitDamaged events following UnitDestroyed
- fix BuilderCAI crash when parsing invalid build-commands
- fix canBeAssisted-check in Builder::StartBuild
- fix ATI uniform-type validation for LuaMaterials
- fix ATI driver crash with BumpWater (on any map without a coastline) in TextureAtlas generation
- fix crash in AdvTreeDrawer on ARB-only junkware
- fix crash in InfoTextureHandler on ARB-only junkware
- fix PlayerRoster causing memory corruption on reload
- fix random WaitingDamage memory corruption
- fix Light::ClearDeathDependencies memory corruption
- fix CollisionHander::MouseHit not taking relMidPos translation into account
- fix LosHandler::UnitLoaded removing LOS from non-stunned units
- fix calling alSourcePlay even if alSourceQueueBuffers produced an error
- fix CheckEnlargeDrawArray for VA_TYPE's larger than 10 floats
- fix crash if unit is assigned an empty COB-script
- fix potential buffer-overflow in GetFeatures AI callback
- do not bitshift negative values (undefined behavior)
- catch invalid CmdDesc indices in GuiHandler::DrawButtons
- insert missing eventHandler.RemoveClient call in RoamMeshDrawer
- fix #5759 (units flip-flopping between paths due to path-estimator expanding unreachable nodes)
- fix #5778 (crash when reloading with QTPFS)
- fix #5730 (crash during nano-particle creation by builders under specific circumstances)
- fix #5728 (canBeAssisted=false factories only being buildable by one constructor at a time)
- fix #5721 (structures created via AI orders sometimes not leveling ground)
- fix #5715 (zero-spread weapons avoiding non-target enemies)
- fix #5690 (Spring.GetProjectileTarget returning <0,0,0> for cannons with ground-attack orders)
- fix #5519 (path-estimator failure if start- and goal-coordinates mapped to the same block)
- fix #5684 (Spring.{Add,Remove}Grass updates not taking effect until camera is moved)
- fix #5658 (projectiles applying two position-updates while bounced)
- fix #5630 (free line-of-fire detection failure)
- fix #5287 (help units in firebases with a collideFireBase weapondef flag)
- fix #2970 ("pushResistant" is now accepted by MoveCtrl.SetGroundMoveTypeData)
- fix #3515 (better error-messages for the /team command)
- fix #5200 (broken ctrl+mousewheel tilt transitions with 'Spring' camera)
- fix #5258 (custom selection volumes)
- fix #5632 (don't show just a black screen on startup)
- fix #5629 (make footprint-terraforming respect buildee's actual facing)
- fix #4447 (FPS-mode locking onto out-of-LOS units)
- fix #4074 (equalize UnitDamaged parameters for LuaUI and LuaRules)
- fix #2855 #5092 #5180 (jagged terrain shadows)
- fix #5619 (area-commands not drawn on minimap)
- fix #5617 (enable non-binary alpha-testing for unit icons)
- fix #5684 (Spring.{Add,Remove}Grass updates not taking effect until camera is moved)
- fix #4164 (shield{Good,Bad}Color are RGBA float4's now)
- fix #5587 (units in sharp holes sinking underground if also skidding)
- fix #5502 (crash with malformed build-commands)
- fix #4723 (EmitSfx crash when referencing effect not defined in unitdef)
- fix #4940 ("Recompressing Map Tiles with ETC1" load-stage triggering watchdog)
- fix #5403 (extra ShieldPreDamaged parameters)
- fix #5056 (let Spring.GetUnitWeaponHaveFreeLineOfFire take firing location as an argument)
- fix #5188 (units refusing to move if ordered to non-reachable locations from factory)
- fix #5639 (stunned transports not updating the position of their cargo)
- fix #5304 (invisible collada models if no secondary texture provided)
- fix #5318 (.ogg audio streams playing too fast)
- fix #5358 (theoretical desync with std::{strtod,atof})
- fix #5457 (TargetBorder broken for non-box collision volumes)
- fix #5411 (PFS not finding optimal paths on maps with extreme speed-modifiers)
- fix #5501 (PFS ignoring obstacles higher up or lower down cliffs)
- fix #5469 (overflow-FPE in GetHeadingFromVectorF)
- fix #5476 (assertion-failure with broken springcontent installation)
- fix #5434 (add logging to detect unicode-aware libIL)
- fix #5387 (GroundDecalHandler crash on exit)
- fix #5421 (Spring.SendCommands("ctrlpanel") crash if sent inside a callin)
- fix #5412 (GameRulesParams persisting through Spring.Reload)
- fix #5493 (crash while reloading with LoadingMT=1)
- fix #5463 (failing to connect to server sends user back to LuaMenu)
- fix #5544 (classified)
- fix #5468 (classified)
- fix #5461 (classified)
- fix #5404 (MoveCtrl.SetGunshipMoveTypeData crash if called for a non-gunship unit)
- fix #5483 (glDeleteList called from multiple threads)
- fix #5423 (random number generation in defs.lua)
- fix #5396 (units lacking sensors on fire-platforms)
- fix #5339 (crash when placing a geothermal)
- fix #5338 (grid-patterns in unsynced heightmap)
- fix #5644 (send BuggerOff notes from opened-but-blocked factories again)
- fix #4745 (broken transport-unloading with non-zero unloadSpread)
- fix #4971 (constructors not assisting if simultaneously given orders to build count-restricted units)
- fix #4481 (check MoveDef maxSlope for units built by mobile constructors)
- fix #4827 (idle gunships jiggling away from their position)
- fix #4232 (gunships snapping to horizontal attitude when ordered to stop after attacking)
-- 103.0 --------------------------------------------------------
General:
- Fix & Improve performace
- Add 'allowTake' modoption (default: true) to enable/disable /take (by lamer)
- Add onlyLocal boolean value to modinfo.lua (default false)
If true, spring won't listen for incoming connections when running
this game unless GAME\OnlyLocal is specified in the start script.
Sim:
- Add new UnitDef tag "buildingMask" and LuaSyncedCtrl function "SetSquareBuildingMask". (by ivand)
Both used in conjunction to allow/disallow construction of certain unit types (via setting buildingMask)
on certain tiles (via SetSquareBuildingMask). By default all tiles and buildings have mask of 1
Rendering:
- Ghosted buildings are now consistent when changing specTeam/specFullView
Bugfixes:
- Fix #5301 (Units with restricted firearcs do not turn to aim)
- Fix #5302 (extreme slowdown)
-- 102.0 --------------------------------------------------------
General:
- Fix & Improve LoS performance
! remove LuaModUICtrl config setting
! remove ClassicGroundMoveType
! remove SpringLobby from spring installer
- update model matrices on demand instead of once per frame
Sim:
! allow units to unstuck themselves from an unpathable square
into an adjacent pathable one
! COB: deprecate unit/team/allyteam/global vars. Use lua functions instead
- prevent accidental friendly fire from direct line of fire weapons
Lua:
- Add {Set,Get}FeatureRulesParam(s)
! Get{Game,Team,Unit,Feature}RulesParams will now return { paramName = value, ... }
- You can now delete RulesParams by calling Set{Game,Team,Unit,Feature}RulesParam with no value argument or a nil one.
- Add new Spring.ClearUnitGoal(unitID) callout.
- add GamePaused and GameProgress callins to base gadget-handler
- extend builtin uniform binding for custom Lua materials
SEE "fix LuaMaterial uniform management" BELOW FOR THE
LIST OF NEW LOCATION KEYS THAT ARE RECOGNIZED AS OF 102
- Add Spring.GetFrameTimer(bool synced) to get a timer for the start of the frame
this should give better results for camera interpolations.
- Add an optional weaponNum argument to SetUnitTarget.
- Update shader errorlog even if compilation was successful
- Remove updateMatrix argument in Spring.UnitScript.{Move,Turn} as matrices will be automatically updated if necessary.
- Add new Spring.Start callout for launching a new Spring instance without terminating the existing one. See Spring.Restart for parameters.
- Add new VFS.GetAvailableAIs([gameName] [, mapName])->{ai1, ai2, ...} callout for getting a list of all Spring AIs. The optional gameName and mapName parameters can be used to include game/map specific LuaAIs in the list.
Save/Load:
! remove UseCREGSaveLoad and add /LuaSave which generates .slsf files
! compress creg saves
- SaveFile can be specified in start script in order to start from a save
Rendering:
- reduce number of team-color updates for custom shaders
- use frame-extrapolation for smoother feature movement
- draw all model nanoframe stages with shaders by default
- skip drawing icons for void-space units
- disable BumpWaterRefraction = 2 for now.
AI:
- make skirmishAiCallback_Unit_getResource{Use,Make} not round their return values to ints
- RulesParams are now accessible through skirmishAiCallback_{Game,Unit,Team,Feature}_getRulesParamValue{String,Float}
Misc:
- make the time server spends in sleep calls configurable (for dedicated hosts)
- rename the 'ReflectiveWater' config-key to 'Water' (to match the command)
- set the 'GroundDetail' config-val only when it changes, not on shutdown
- add '/GroundDetail <val>' text command to modify ground detail on the fly
- auto-normalize normals and tangents for all AssImp-loaded models
- add a gameDeferredDraw=5 drawMode value (handy for Draw{Unit,Feature} to know)
Bugfixes:
- fix invisible OBJ models
- fix gl.DeleteShader allowing repeated deletion
- fix drawing of being-built units during deferred pass
- fix invisible ground on voidwater maps when AdvMapShading=0 (in L-view)
- fix Spring.SetSunLighting crash when AdvMapShading=0
- fix Spring.ValidUnitID to accept nils again
- fix wreckage jumping from large *horizontal* impulse
- fix landed HoverAirMoveType aircraft behavior when given a command within their build range
! fix LuaMaterial uniform management for materials with standard and deferred shaders
material tables are now expected to contain subtables defining the uniforms; instead of
"material = {shader = ..., cameraposloc = 123, texunits = ..., ...}"
say
"material = {shader = ..., uniforms = {cameraposloc = 123, ...}, texunits = ..., ...}"
for a material that has both types of shader, supply "standardshader",
"deferredshader", "standarduniforms", and "deferreduniforms" as keys
new keys for these uniform subtables can be
"viewmatrixloc" // synonym for "cameraloc"
"projmatrixloc" // camera projection
"viprmatrixloc" // camera view-projection
"viewmatrixinvloc" // synonym for "camerainvloc"
"projmatrixinvloc" // camera inverse projection
"viprmatrixinvloc" // camera inverse view-projection
"shadowmatrixloc" // synonym for "shadowloc"
"cameradirloc" // camera forward direction
"sundirloc" // synonym for "sunposloc"
"rndvecloc" // random 3-vector with length in [0, 1)
"simframeloc" // current simulation frame
"visframeloc" // current renderer frame
- fix #5182 (unwanted sun-texture reflections)
- fix #5175 (microscopic FarTexture impostors)
- fix #5166 (wrecks buried underground on maps with negative hardness)
- fix #5165 (rare crash on exit or reload)
- fix #5161 (Spring.IsUnitAllied always returning true in unsynced gadgets)
- fix #5160 (Spring.SetSunLighting not working if applied in *get:Initialize and crashing when AdvMapShading=0)
- fix #5157 (skirmishAiCallback_Unit_get{Pos,Vel} broken with cheats enabled)
- fix #5155 (MoveCtrl.SetRotation not matching Spring.GetUnitRotation)
- fix #5149 (EVENT_ENEMY* AI events not being sent)
- fix #5148 (assertion failure with custom shaders)
- fix #5146 (missing wreckage healthbars)
- fix #5141 (glitchy tree rendering)
- fix #5136 (texture corruption with custom Lua materials)
- fix #5135 (missing SFX.FIRE and SFX.SMOKE effects)
- fix #5134 (broken zoom in track-mode with Spring camera)
- fix #5084 (allow LuaUI self-disabling)
- fix #5131 (order-lines visualization)
- fix #5130 (put projectiles created by Spring.SpawnProjectile in Gaia team)
- fix #5127 (icon-transparency over water)
- fix #5181 (aircraft sometimes fail to land)
- fix #5177 (stack-buffer-overflow in TextWrap.cpp)
- fix #5172 (segfault on assimp loading)
- fix #5173 (air transports fail to pick up units)
- fix #5174 (hover move type tend to exactly land on top of each other)
- fix #5176 (crash in CobThread)
- fix #5106 (Strafe planes dont land when reaching target or on 'stop' command)
- fix #5152 (heap-use-after-free when loading a game)
- fix wrong radar icons when switching specfullview
- fix #5216 Spring.GetVisibleUnits
- fix #5219 pink features & units
- fix #5223 buffer-overflow when using /water
-- 101.0 --------------------------------------------------------
Major:
- LoS (sim) overhaul
- SSMF Splat Detail Normal Textures (by Beherith)
- many new Lua rendering related features (custom feature shaders, map shaders, ...)
- many Lua additions
- Lua pr-downloader API
- removal of airbases & fuel
- transport overhaul
- 64bit windows builds
General:
! change default screenshot file type to jpg. to create png use /screenshot png
! pr-downloader dependency is now mandatory (statically linked with spring)
! demo files are now compressed with gzip (and the suffix is .sdfz)
- improve data locality even further with respect to 100.0
- fix memory leaks and misc. crashes (some related to LoadingMT)
- ignore /give commands issued via autohost interface (needs an actual player)
LoS:
! ModInfo: remove losMul & airLosMul -> always handle los ranges in elmos in the _whole_ engine
WARNING: this also rescales the returned values in Lua UnitDefs!
! ModInfo: make `radarMipLevel` configurable
! change default airMipLevel 2->1 & radarMipLevel 3->2
! ModInfo: add new sensors.alwaysVisibleOverridesCloaked (default _off_! before was always on)
! modrules.lua: add new `separateJammers` tag (breaks backward compatibility!)
default true (old behaviour is false)
when enabled each allyTeam only jams their own units
! get rid of los radius limit (you can now create units that cover the whole map and more)
- speed ups in general
- reduced lags introduced by LoS
- multithread LoS updating
- reduced memory usage
! fix various bugs related to unit/feature movement not registered
! update LoS on terrain changes
! correctly handle the height of the emitter (before radarEmitHeight was always from ground height & similar units on a spot shared their emitHeight)
! make LoS much smoother (now really gets called per-gameframe when the emitter moves)
- better circle algo
- add Spring.SetGlobalLos(int allyTeamID, bool globallos)
Sim:
! start simulation at frame 0, not at 1
- features now have a non-animated LocalModel and can use per-piece collision volumes
- RockUnit and HitByWeapon script callins now take vectors in unit-space
- fix acceleration rates and turn-speed limits for reversing units
- fix units occasionally zipping across the map after being unloaded
- fix unloaded units being non-colliding if transporter script attached them to piece -1
- fix various aircraft landing/midair-vibrating bugs
- fix builders sometimes ignoring their commands if they were issued without shift
- set better default radii for objects (and use same logic in all model parsers)
- make ground-unit reversing logic configurable via Spring.SetGroundMoveTypeData
- fix ground-units forever trying to move along their final waypoint direction in rare cases
- COB: always use the return value of the Killed thread to determine wreck level (none if omitted)
! remap SFX.RECURSIVE piece flag from 1<<8 to 1<<14
! removed hardcoded logic to zombify (stun+immobilize) a unit on death
! airbases and fuel were removed, use custom commands in combination with
Spring.SetUnitLandGoal(unitID, x, y, z [, radius]) and the new transport changes
to implement this functionality in lua.
Transports:
- every unit can now have other units attached to it using:
- Spring.UnitAttach(transporterID, passengerID, pieceNum)
- Spring.UnitDetach(passengerID)
- Spring.UnitDetachFromAir(passengerID)
- units with transportCapacity > 0 and transportMass > 0 will retain backward compatibility
- added Spring.SetUnitLoadingTransport(passengerID, transportID) which disables collisions
between the two units to allow colvol intersection during the approach.
GUI/Sound:
! fix default drawInMap keyshortcut on german keyboards
- fix displayed tooltip elevation when over minimap
- fix Ready button ignoring clicks after setting startpos and rejoining
- fix potential infinite loop during sound initialization
Rendering:
- new Shatter animation (SFX.Explode in Cob/LUS)
- break the piece into parts and not triangles
- much faster (in creation & render time)
- change the trail drawing of some missile projectiles
- add support for SSMF Splat Detail Normal Textures (by Beherith)
- add deferred pass for features; note that these are drawn into
the same buffer as units (overwriting it, unless the new config
variable AllowDeferredModelBufferClear is set to false [default])
- allow custom shaders for being-built units
- allow custom Lua map shaders
- fix metal->los info texture switching visual harshness
- apply anisotropic filtering to all mipmapped SSMF textures
- fix shadow-pass (and general) terrain/model visibility culling
- fix environment reflections (broken in four different ways)
- fix DynamicWater artifacts at large viewing distances
- fix RefractiveWater not showing submerged objects with DualScreenMinimapOnLeft
- fix truncation of deferred model normals
- do not disable model shaders during world alpha-pass
- do not disable model shaders during water ref{le,ra}ction passes
- always draw water surface during alpha-pass
- kill shadows for fully alpha-faded features
- kill impostors for fully alpha-faded features
- write extraColor to the specTex target on the deferred side of ModelFragProg
- use groundSpecularColor when no specularTex exists (i.e. on basic SMF maps)
- shift ground decals visually so they are always aligned with objects
- render all types of decals with shaders
- draw custom commands that have two parameters
! nuke support for "special" Spring{Radius,Height} pieces in assimp models
GameServer:
- speedup gameserver exiting (reduced some io/net related sleeps)
Pathing:
- fix cases where either no path was returned or an incorrect one
- switch to octile heuristic to reduce number of explored nodes
- increase high-resolution search range
- fix diagonal movement cost estimation
- handle PathCache crc failures
- make QTPFS neighbor updates a bit faster
AI:
- plug several memory leaks in engine interface and wrappers
- bring ghost model drawing in a usable state again
- add sensor map callbacks
- add shield state callbacks
- add ground info callbacks
- make feature callbacks respect cheats
Lua Callins:
! GameID callin now gets the ID string encoded in hex.
! new Lua callin RenderUnitDestroyed is now called just before a unit is
invalid, after it finishes its death animation.
! ShieldPreDamaged will now be called for LightningCannon and BeamLaser.
Two new arguments were added: beamCarrierWeaponNum and beamCarrierUnitID.
These will be populated in place of the first argument (projID).
! The following callins will now have 1-based weapon index arguments:
DrawShield,
ShieldPreDamaged,
AllowWeaponTargetCheck,
AllowWeaponTarget,
AllowWeaponInterceptTarget,
StockpileChanged
! UnitCommand and UnitCmdDone argument order changed to be consistent with
each other and with CommandFallback & AllowCommand: (unitID,
unitDefID, unitTeam, cmdId, cmdParams, cmdOpts, cmdTag)
Note that UnitCommand will now receive cmdOpts as a table and not as a number
- new callin UnitReverseBuilt, called when a living unit becomes a nanoframe again
- add new callins DrawGroundPreForward and DrawGroundPreDeferred
these run at the start of their respective passes when a custom
map shader has been assigned via Spring.SetMapShader (convenient
for setting uniforms)
- add new callin DrawGroundPostDeferred; this runs at the end of its
respective deferred pass and allows proper frame compositing (with
ground flashes/decals/foliage/etc, which are drawn between it and
DrawWorldPreUnit) via gl.CopyToTexture
- add new callins DrawUnitsPostDeferred and DrawFeaturesPostDeferred
these run at the end of their respective deferred passes to inform
Lua code it should make use of the $model_gbuffer_* textures before
another pass overwrites them (and to allow proper blending with e.g.
cloaked objects which are drawn between these events and DrawWorld
via gl.CopyToTexture)
NOTE: the *PostDeferred events are only sent (and only have a real
purpose) if forward drawing is disabled, whereas the DrawGroundPre*
events are only sent if the map has a custom shader!
LuaDefs:
! los related UnitDefTags are now in elmos
! Lua{Feature,Unit}Defs:
make the "model" subtable available (as it is for LuaUnitDefs)
move the {min,max,mid}{x,y,z} values to this table (these can now be accessed
using e.g. *Defs[i].model.midx)
deprecate *Defs[i].modelname, use *Defs[i].model.path instead
Lua (lighting):
! Game.fogColor constant is no longer available, use gl.GetAtmosphere("fogColor")
! Game.groundAmbientColor, Game.groundSpecularColor and Game.groundSunColor
are no longer available, use gl.GetSun() instead with appropriate parameters
- add unsynced callout Spring.SetSunLighting(table params) -> nil
It can be used to modify the following sun lighting parameters:
{ground,unit}{Ambient,Diffuse,Specular}Color and specularExponent
example usage: Spring.SetSunLighting({
groundAmbientColor = {1, 0.1, 1},
groundDiffuseColor = {1, 0.1, 1},
})
- add unsynced callout Spring.SetAtmosphere(table params) -> nil
It can be used to modify the following atmosphere parameters:
fog{Start,End}, {sun,sky,cloud}Color
example usage: Spring.SetAtmosphere({
fogStart = 0,
fogEnd = 0.5,
fogColor = { 0.7, 0.2, 0.2, 1 },
})
- add unsyced callout gl.GetAtmosphere(name) -> number | number r, number g, number b
Works similar to gl.GetSun(), and can be used to extract atmosphere parameters.
See Spring.SetAtmosphere for details.
Lua (projectiles):