@@ -66,9 +66,47 @@ DcCommand2 max_fps_cmd{
66
66
" maxfps <limit>" ,
67
67
};
68
68
69
+ struct DebugFlagDesc
70
+ {
71
+ bool & ref;
72
+ const char * name;
73
+ bool clear_geometry_cache = false ;
74
+ };
75
+
76
+ DebugFlagDesc g_debug_flags[] = {
77
+ {AddrAsRef<bool >(0x0062F3AA ), " thruster" },
78
+ // debug string at the left-top corner
79
+ {AddrAsRef<bool >(0x0062FE19 ), " light" },
80
+ {g_dbg_static_lights, " light2" },
81
+ {AddrAsRef<bool >(0x0062FE1A ), " push_climb_reg" },
82
+ {AddrAsRef<bool >(0x0062FE1B ), " geo_reg" },
83
+ {AddrAsRef<bool >(0x0062FE1C ), " glass" },
84
+ {AddrAsRef<bool >(0x0062FE1D ), " mover" },
85
+ {AddrAsRef<bool >(0x0062FE1E ), " ignite" },
86
+ {AddrAsRef<bool >(0x0062FE1F ), " movemode" },
87
+ {AddrAsRef<bool >(0x0062FE20 ), " perf" },
88
+ {AddrAsRef<bool >(0x0062FE21 ), " perfbar" },
89
+ {AddrAsRef<bool >(0x0064E39C ), " waypoint" },
90
+ // network meter in left-top corner
91
+ {AddrAsRef<bool >(0x006FED24 ), " network" },
92
+ {AddrAsRef<bool >(0x007B2758 ), " particlestats" },
93
+ // debug strings at the left side of the screen
94
+ {AddrAsRef<bool >(0x007CAB59 ), " weapon" },
95
+ {AddrAsRef<bool >(0x00856500 ), " event" },
96
+ {AddrAsRef<bool >(0x0085683C ), " trigger" },
97
+ {AddrAsRef<bool >(0x009BB5AC ), " objrender" },
98
+ {g_dbg_geometry_rendering_stats, " roomstats" },
99
+ // geometry rendering
100
+ {AddrAsRef<bool >(0x009BB594 ), " trans" , true },
101
+ {AddrAsRef<bool >(0x009BB598 ), " room" , true },
102
+ {AddrAsRef<bool >(0x009BB59C ), " portal" , true },
103
+ {AddrAsRef<bool >(0x009BB5A4 ), " lightmap" , true },
104
+ {AddrAsRef<bool >(0x009BB5A8 ), " nolightmap" , true },
105
+ };
106
+
69
107
DcCommand2 debug_cmd{
70
108
" debug" ,
71
- [](std::optional<std:: string> type_opt ) {
109
+ [](std::string type ) {
72
110
73
111
#ifdef NDEBUG
74
112
if (rf::is_net_game) {
@@ -77,100 +115,44 @@ DcCommand2 debug_cmd{
77
115
}
78
116
#endif
79
117
80
- auto type = type_opt ? type_opt.value () : " " ;
81
- bool handled = false ;
82
- static bool all_flags = false ;
83
-
84
- if (type.empty ()) {
85
- all_flags = !all_flags;
86
- handled = true ;
87
- rf::DcPrintf (" All debug flags are %s" , all_flags ? " enabled" : " disabled" );
88
- }
89
-
90
- auto handle_flag = [&](bool & flag_ref, const char * flag_name) {
91
- bool old_flag_value = flag_ref;
92
- if (type == flag_name) {
93
- flag_ref = !flag_ref;
94
- handled = true ;
95
- rf::DcPrintf (" Debug flag '%s' is %s" , flag_name, flag_ref ? " enabled" : " disabled" );
96
- }
97
- else if (type.empty ()) {
98
- flag_ref = all_flags;
118
+ for (auto & dbg_flag : g_debug_flags) {
119
+ if (type == dbg_flag.name ) {
120
+ dbg_flag.ref = !dbg_flag.ref ;
121
+ rf::DcPrintf (" Debug flag '%s' is %s" , dbg_flag.name , dbg_flag.ref ? " enabled" : " disabled" );
122
+ if (dbg_flag.ref && dbg_flag.clear_geometry_cache ) {
123
+ rf::GeomClearCache ();
124
+ }
125
+ return ;
99
126
}
100
- return old_flag_value != flag_ref;
101
- };
102
-
103
- // clang-format off
104
- auto &dg_thruster = AddrAsRef<bool >(0x0062F3AA );
105
- auto &dg_lights = AddrAsRef<bool >(0x0062FE19 );
106
- auto &dg_push_and_climbing_regions = AddrAsRef<bool >(0x0062FE1A );
107
- auto &dg_geo_regions = AddrAsRef<bool >(0x0062FE1B );
108
- auto &dg_glass = AddrAsRef<bool >(0x0062FE1C );
109
- auto &dg_movers = AddrAsRef<bool >(0x0062FE1D );
110
- auto &dg_entity_burn = AddrAsRef<bool >(0x0062FE1E );
111
- auto &dg_movement_mode = AddrAsRef<bool >(0x0062FE1F );
112
- auto &dg_perfomance = AddrAsRef<bool >(0x0062FE20 );
113
- auto &dg_perf_bar = AddrAsRef<bool >(0x0062FE21 );
114
- auto &dg_waypoints = AddrAsRef<bool >(0x0064E39C );
115
- auto &dg_network = AddrAsRef<bool >(0x006FED24 );
116
- auto &dg_particle_stats = AddrAsRef<bool >(0x007B2758 );
117
- auto &dg_weapon = AddrAsRef<bool >(0x007CAB59 );
118
- auto &dg_events = AddrAsRef<bool >(0x00856500 );
119
- auto &dg_triggers = AddrAsRef<bool >(0x0085683C );
120
- auto &dg_obj_rendering = AddrAsRef<bool >(0x009BB5AC );
121
- // Geometry rendering flags
122
- auto & render_everything_see_through = AddrAsRef<bool >(0x009BB594 );
123
- auto & render_rooms_in_different_colors = AddrAsRef<bool >(0x009BB598 );
124
- auto & render_non_see_through_portal_faces = AddrAsRef<bool >(0x009BB59C );
125
- auto & render_lightmaps_only = AddrAsRef<bool >(0x009BB5A4 );
126
- auto & render_no_lightmaps = AddrAsRef<bool >(0x009BB5A8 );
127
- // clang-format on
128
-
129
- handle_flag (dg_thruster, " thruster" );
130
- // debug string at the left-top corner
131
- handle_flag (dg_lights, " light" );
132
- handle_flag (g_dbg_static_lights, " light2" );
133
- handle_flag (dg_push_and_climbing_regions, " push_climb_reg" );
134
- handle_flag (dg_geo_regions, " geo_reg" );
135
- handle_flag (dg_glass, " glass" );
136
- handle_flag (dg_movers, " mover" );
137
- handle_flag (dg_entity_burn, " ignite" );
138
- handle_flag (dg_movement_mode, " movemode" );
139
- handle_flag (dg_perfomance, " perf" );
140
- handle_flag (dg_perf_bar, " perfbar" );
141
- handle_flag (dg_waypoints, " waypoint" );
142
- // network meter in left-top corner
143
- handle_flag (dg_network, " network" );
144
- handle_flag (dg_particle_stats, " particlestats" );
145
- // debug strings at the left side of the screen
146
- handle_flag (dg_weapon, " weapon" );
147
- handle_flag (dg_events, " event" );
148
- handle_flag (dg_triggers, " trigger" );
149
- handle_flag (dg_obj_rendering, " objrender" );
150
- handle_flag (g_dbg_geometry_rendering_stats, " roomstats" );
151
- // geometry rendering
152
- bool geom_rendering_changed = false ;
153
- geom_rendering_changed |= handle_flag (render_everything_see_through, " trans" );
154
- geom_rendering_changed |= handle_flag (render_rooms_in_different_colors, " room" );
155
- geom_rendering_changed |= handle_flag (render_non_see_through_portal_faces, " portal" );
156
- geom_rendering_changed |= handle_flag (render_lightmaps_only, " lightmap" );
157
- geom_rendering_changed |= handle_flag (render_no_lightmaps, " nolightmap" );
158
-
159
- // Clear geometry cache (needed for geometry rendering flags)
160
- if (geom_rendering_changed) {
161
- auto geom_cache_clear = (void (*)())0x004F0B90 ;
162
- geom_cache_clear ();
163
127
}
164
128
165
- if (!handled)
166
- rf::DcPrintf (" Invalid debug flag: %s" , type.c_str ());
129
+ rf::DcPrintf (" Invalid debug flag: %s" , type.c_str ());
167
130
},
168
131
nullptr ,
169
- " debug [thruster | light | light2 | push_climb_reg | geo_reg | glass | mover | ignite | movemode | perf | "
170
- " perfbar | waypoint | network | particlestats | weapon | event | trigger | objrender | roomstats | trans | "
132
+ " debug [thruster | light | light2 | push_climb_reg | geo_reg | glass | mover | ignite | movemode | perf |\n "
133
+ " perfbar | waypoint | network | particlestats | weapon | event | trigger | objrender | roomstats | trans |\n "
171
134
" room | portal | lightmap | nolightmap]" ,
172
135
};
173
136
137
+ void DisableAllDebugFlags ()
138
+ {
139
+ bool clear_geom_cache = false ;
140
+ for (auto & dbg_flag : g_debug_flags) {
141
+ if (dbg_flag.ref && dbg_flag.clear_geometry_cache )
142
+ clear_geom_cache = true ;
143
+ dbg_flag.ref = false ;
144
+ }
145
+ if (clear_geom_cache)
146
+ rf::GeomClearCache ();
147
+ }
148
+
149
+ CodeInjection MpInit_disable_debug_flags_patch{
150
+ 0x0046D5B0 ,
151
+ []([[maybe_unused]] auto & regs) {
152
+ DisableAllDebugFlags ();
153
+ },
154
+ };
155
+
174
156
void DebugRender3d ()
175
157
{
176
158
const auto dbg_waypoints = AddrAsRef<void ()>(0x00468F00 );
@@ -650,4 +632,6 @@ void CommandsAfterGameInit()
650
632
map_cmd.Register ();
651
633
input_mode_cmd.Register ();
652
634
debug_cmd.Register ();
635
+
636
+ MpInit_disable_debug_flags_patch.Install ();
653
637
}
0 commit comments