17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-17 02:49:19 +02:00
Commit Graph

3148 Commits

Author SHA1 Message Date
jerrrrycho
6547f7e967 fix(sonar): give polymorphic base classes virtual destructors (cpp:S1235)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:48:07 +02:00
jerrrrycho
9b89a5d887 refactor(sonar): scope single-use variables in if init-statements (cpp:S6004)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:44:18 +02:00
jerrrrycho
f8104bd0dd refactor(sonar): merge collapsible nested if statements (cpp:S1066)
Comments that preceded the inner if are kept above the merged statement.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:39:11 +02:00
jerrrrycho
3198cabc78 refactor(sonar): declare non-mutating member functions const (cpp:S5817)
Virtual functions are left untouched so overrides keep matching.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:26:48 +02:00
jerrrrycho
1f256e9593 refactor(sonar): mark unused parameters (cpp:S1172)
Unused names are commented out; parameters used only on some platforms
are marked [[maybe_unused]].

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:18:45 +02:00
jerrrrycho
8c23c1fe2b refactor(sonar): make narrowing conversions explicit (cpp:S5276)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:16:28 +02:00
jerrrrycho
80464d0bc1 refactor(sonar): construct elements in place with emplace_back (cpp:S6003)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:06:57 +02:00
jerrrrycho
789e391420 refactor(sonar): use std::scoped_lock instead of std::lock_guard (cpp:S5997)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:06:48 +02:00
jerrrrycho
7e8081d904 refactor(sonar): remove redundant casts (cpp:S1905)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:06:37 +02:00
jerrrrycho
c831bb543c refactor(sonar): remove redundant access specifiers (cpp:S3539)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:05:48 +02:00
jerrrrycho
1806f029cc refactor(sonar): use nullptr literal (cpp:S4962)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:05:47 +02:00
jerrrrycho
7b3109061e refactor(sonar): use =default for trivial special members (cpp:S3490)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:05:45 +02:00
jerrrrycho
3d7a06f425 refactor(sonar): prefer using over typedef (cpp:S5416)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:05:42 +02:00
jerrrrycho
caa1313407 refactor(sonar): drop redundant lambda return types (cpp:S3574)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:04:25 +02:00
jerrrrycho
65ded920d2 refactor(sonar): remove empty statements, one declaration per statement (cpp:S1116, cpp:S1659)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:03:30 +02:00
jerrrrycho
8ce68e3d41 refactor(sonar): use override instead of redundant virtual (cpp:S3471)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 14:55:56 +02:00
jerrrrycho
79bd0c8e91 fix(sonar): addressing reliability/security issues (#202) 2026-10-04 20:00:13 +02:00
pawelw
51521a135a Text displays: accept characters above 127, in windows-1250 or utf-8 (#198)
* Text displays: accept characters above 127, in windows-1250 or utf-8

A text display (sub-model of type "text") looks up the sub-model of each character
in a 256 entry table, and indexed it with a plain char. With char being signed, any
character above 127 gave a negative index: reading the text went outside the table,
and so did filling the table if a character sub-model had such a name. In effect the
displays could only show ASCII, and a text with national characters could crash.

The lookup is now keyed by unicode code point. Both the displayed text and the names
of the character sub-models are decoded as utf-8 if they are valid utf-8, and as
windows-1250 otherwise, so legacy (ansi) sceneries and models work next to utf-8
ones, and the two can be mixed. A short ansi text can be valid utf-8 by accident
(two upper case accented letters in a row will do); when both readings are possible
the one which finds more of its characters in the model is used.

The rest is unchanged: the first character of the text still isn't displayed, the
characters are still drawn in the translucent pass only. A missing text pointer no
longer gets dereferenced.

* Text displays: prepare the characters once for each text

The sequence of character sub-models was cached for the last text only, so
displays of several instances drawn in turn decoded their texts again on
every draw. It is now kept for each text the display shows; the texts of the
instances don't change, so a draw costs a single lookup.

Also the comments added in the renderers are now in English.

* Text displays: move the text decoding to utilities

utf8_to_utf32() and win1250_to_utf32(), with the windows-1250 table, now sit
next to win1250_to_utf8(). The existing function maps only the Polish letters
and passes other bytes above 127 through, so it can't serve the displays.

* Text displays: address the SonarCloud findings

std::array instead of the C-style arrays, the utf-8 sequence length worked
out in a function of its own instead of nested conditional operators,
std::byte for the bit operations, std::ranges::count_if and contains().
The character loop of the renderers moved to Render_Alpha_text(), which
takes the nesting back to the limit, and the static pasText is accessed
through the class.
2026-10-03 12:05:32 +02:00
jerrrrycho
06fc3915f4 fix(renderer): guard replacable skin lookup and light colour access (#200) 2026-10-02 21:19:16 +02:00
jerrrrycho
76a39af8c2 fix: bound MotorParam and MPTRelay indices (#196) 2026-10-01 20:21:01 +02:00
09e02a75a7 Merge pull request #195 from MaSzyna-EU07/fix/instancing
Improve instancing rendering speed
2026-10-01 20:18:19 +02:00
jerrrrycho
1474d2b773 fix: merge nested ifs in Driver.cpp cpp:s1066 (#194) 2026-10-01 13:30:36 +02:00
jerrrrycho
06078ddab9 fix: other sonar sast fixes (#193) 2026-10-01 13:30:25 +02:00
d670c4b116 perf(instancing): skip models without shadow casters in shadow passes 2026-10-01 12:57:33 +02:00
2130d175e9 perf(instancing): cache instance rotation and group lod bands linearly 2026-10-01 12:43:07 +02:00
4eabf3c3b5 feat(instancing): batch models animated only by time, wind or sky 2026-10-01 12:07:54 +02:00
20f536f05e fix(instancing): keep batches correct after load-time classification 2026-10-01 11:51:41 +02:00
jerrrrycho
f05b58b0e9 Revert "fix: yet other sonar sast fixes"
This reverts commit 403a6d1f9f.
2026-10-01 08:01:23 +02:00
jerrrrycho
403a6d1f9f fix: yet other sonar sast fixes 2026-10-01 07:58:28 +02:00
jakubg1
10985fbf46 Merge pull request #190 from pwarszawski/fix/reardriver-reverser
Send the reverser position, not the absolute direction, when activating a cab
2026-10-01 03:35:08 +02:00
jakubg1
40a6fbbb31 Merge pull request #192 from jakubg1/fix-ew58-ai-unbrake
Remove brake position check from `TController::PrepareEngine()`
2026-10-01 02:24:36 +02:00
jakubg1
99c5a0090b Remove brake position check from TController::PrepareEngine()
The function would flag the consist as not ready (`iEngineActive` set to `false`) when the brake handle was at a cutoff position. Since this is what the brake lever is exactly starting at in the EW58 train, the train when asked to move the brake lever to operating position would not listen since the `control_tractive_and_braking_force()` function which is supposed to do that is gated behind the readiness flag in the `TController::Update()` function.

This makes sure EW58 trains can be driven by AI once again instead of being stuck.

I don't really know why the brake position check was there, since it would fail only if:
- There is a brake handle
- The brake handle is in the cutoff position
- The brake handle is NOT in the operating position

The third check seems redundant but curiously there is one case where this matters and it's... MHZ_EN57. Its operating and cutoff positions are both defined as `0`, which might be a hack, since the actual cutoff position in the MHZ_EN57 handle is meant to be `6`.
2026-10-01 02:10:21 +02:00
f9deee5cfd fix(editor): stuck brush after clicks on UI; add polygon area fill (#191) 2026-10-01 02:03:49 +02:00
pwarszawski
96be688d13 Send the reverser position, not the absolute direction, when activating a cab
CabActivisation() passed DirAbsolute (DirActive * CabActive) as the value of the
"Direction" command, which every receiving vehicle stores as its own DirActive.
Every other sender passes DirActive. With the cab at the rear end (CabActive = -1)
the two have opposite signs, so the other units got their reverser flipped
against the controlling one.

It shows whenever a rear cab is activated after the reverser has been set:
- the AI takes over an occupied cab (TakeControl() calls CabActivisation(true)),
  e.g. an EN57 inserted with reardriver and a starting velocity: the motor car
  drives the train backwards;
- a vehicle without automatic cab activation (SA134) driven by the AI from the
  start: the cab is activated by a driver hint after the reverser is set, and
  the two units pull against each other.

Fixes #169.
2026-09-30 15:00:12 +02:00
b67bbb19e6 Merge pull request #188 from MaSzyna-EU07/feat/dynobj-seasonal-models
seasonal model variants for vehicle exterior model
2026-09-28 21:21:49 +02:00
jerrrrycho
176427f96b refactor: sonar c++20 changes (#185) 2026-09-28 21:08:15 +02:00
jerrrrycho
4137f5504a fix: sonar sast fixes - sonar.yml, nosonar, linux chmod modification 2026-09-28 21:07:53 +02:00
551f6dbc3b seasonal model variants for vehicle exterior model 2026-09-28 20:49:18 +02:00
jerrrrycho
8fbb482350 feat(materials): texture randomization for loads
* feat(materials): texture randomization for loads
2026-09-27 00:09:16 +02:00
maj00r
b1bdd42178 Forget a buffer's bindings when it is deleted (#182)
The binding tracker kept the name of a deleted buffer. When gl handed that
name to a new buffer, the tracker took it for already bound and skipped the
bind, so a new vao was left without its index buffer and the nvidia driver
read indices from a null pointer.
2026-09-23 01:03:01 +02:00
pawelw
95f41f069f Speed table: keep it sorted and keep the signal indices valid (#178)
* Fix the speed table index remap in TablePurger()

TablePurger() rebuilds the speed table and has to move SemNextIndex and
SemNextStopIndex along with it. Two cases came out wrong.

A trimmed point was never invalidated: the index was first overwritten with
the position the next kept point would take, and the guard that should reset
it to -1 compared the loop counter against that new value, so it only matched
when nothing had been trimmed before it. The index then pointed at an
unrelated record, and if that record happens to sit at zero velocity the
placement can no longer be updated either, because the update requires the
recorded one to be non-zero.

An index pointing at the last entry was left untouched, because the loop stops
one short of it and that entry is appended afterwards. The stale value ended
up past the end of the trimmed table, which is what the provisory check in
TableTraceRoute() catches.

The placements are now recorded separately and assigned once the new table is
complete, with the always-kept last entry handled too. The trim condition is
shared by the counting and the copying pass instead of being spelled out
twice.

TableCheck() drops entries beyond a switch that changed under the scan without
adjusting the placements either, so they are invalidated there as well. The
check in TableTraceRoute() stays as a safety net, without the TODO.

* Sort the whole speed table in TableSort()

TableSort() made a single bubble pass over the table. That only moves an entry
one place towards the front, but TableTraceRoute() adds the scanned events of a
track before the track itself, so a track carrying k scanned events lands k
places too far and needs k passes. With two or more events in one slot - a cab
signal resonator next to a signal, a signal and a W4 - the track entry stays
behind entries that are farther away, and TableUpdate() walks the table out of
distance order until enough later scans have shifted it back.

The range before the last slot is now sorted with std::stable_sort, and the
semaphor placements are moved along by looking their events up again.

---------

Co-authored-by: pwarszawski <pwarszawski@gmail.com>
2026-09-23 01:02:11 +02:00
1d9c608396 light_common: add normal offset to shadow lookups 2026-09-19 21:56:02 +02:00
cb6b97b904 light_common: weight textureGather shadow PCF by sub-texel position 2026-09-19 21:15:49 +02:00
2b51417741 Merge pull request #179 from MaSzyna-EU07/fix/reflections-and-burned-colors
Fix black objects with map: none
2026-09-19 18:44:04 +02:00
306c7eaf26 Adjust param values 2026-09-19 17:09:58 +02:00
468ea1d747 Add shader diffuse multiply 2026-09-19 16:56:39 +02:00
maj00r
2f14006b0b Merge pull request #176 from MaSzyna-EU07/random-seed-entropy
Random seed entropy
2026-09-14 23:29:25 +02:00
7ab753cd4c Merge pull request #177 from MaSzyna-EU07/fix/reflections-and-burned-colors
Improve skybox
2026-09-14 23:15:54 +02:00
maj00r
3fa3853018 fix for sonar 2026-09-14 22:51:33 +02:00
8df81eb46d Improve skybox 2026-09-14 21:11:08 +02:00