Skip to content

Commit 079396a

Browse files
committed
v2: Fix RE3 ViaDispatch layout + RE2/RE3 VR screen squish
RE3 TDB70 uses the same Window/SceneView layout as RE2. The case fallthrough was wrong — RE3 fell through to DMC5's TDB<69 path. Fixed all 6 dispatch points. Renamed W::re3 / SV::re3 to W::re3_tdb67 / SV::re3_tdb67 to clarify the alias is for the old TDB<69 layout (DMC5), not current RE3 TDB70. VR.cpp: fixed screen squish on RE2/RE3 in VR mode.
1 parent 88cc839 commit 079396a

2 files changed

Lines changed: 22 additions & 30 deletions

File tree

shared/sdk/ViaDispatch.hpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@ namespace ns_dd2 {
6363
namespace sdk::via {
6464

6565
// Convenience aliases for the namespaced Window types.
66+
// The re3 regenny layout is for TDB < 69 (old RE3 build, DMC5). Current RE3 TDB70 uses RE2 layout.
6667
namespace W {
6768
using re7 = ns_re7::regenny::via::Window;
68-
using re3 = ns_re3::regenny::via::Window;
69+
using re3_tdb67 = ns_re3::regenny::via::Window;
6970
using re2 = ns_re2::regenny::via::Window;
7071
using mhrise = ns_mhrise::regenny::via::Window;
7172
using re8 = ns_re8::regenny::via::Window;
@@ -77,7 +78,7 @@ namespace W {
7778

7879
namespace SV {
7980
using re7 = ns_re7::regenny::via::SceneView;
80-
using re3 = ns_re3::regenny::via::SceneView;
81+
using re3_tdb67 = ns_re3::regenny::via::SceneView;
8182
using re2 = ns_re2::regenny::via::SceneView;
8283
using mhrise = ns_mhrise::regenny::via::SceneView;
8384
using re8 = ns_re8::regenny::via::SceneView;
@@ -94,9 +95,9 @@ namespace SV {
9495
#define VIA_WIN_FIELD(w, field) \
9596
switch (sdk::GameIdentity::get().game()) { \
9697
case sdk::GameID::RE7: \
97-
case sdk::GameID::RE2: return ((W::re2*)(w))->field; \
9898
case sdk::GameID::RE3: \
99-
case sdk::GameID::DMC5: return ((W::re3*)(w))->field; \
99+
case sdk::GameID::RE2: return ((W::re2*)(w))->field; \
100+
case sdk::GameID::DMC5: return ((W::re3_tdb67*)(w))->field; \
100101
case sdk::GameID::MHRISE: return ((W::mhrise*)(w))->field; \
101102
case sdk::GameID::GGR: \
102103
case sdk::GameID::RE8: return ((W::re8*)(w))->field; \
@@ -119,9 +120,9 @@ inline uint32_t& window_height(void* w) { VIA_WIN_FIELD(w, height); }
119120
#define VIA_WIN_BORDERLESS(w, sub) \
120121
switch (sdk::GameIdentity::get().game()) { \
121122
case sdk::GameID::RE7: \
122-
case sdk::GameID::RE2: return ((W::re2*)(w))->borderless_size.sub; \
123123
case sdk::GameID::RE3: \
124-
case sdk::GameID::DMC5: return ((W::re3*)(w))->borderless_size.sub; \
124+
case sdk::GameID::RE2: return ((W::re2*)(w))->borderless_size.sub; \
125+
case sdk::GameID::DMC5: return ((W::re3_tdb67*)(w))->borderless_size.sub; \
125126
case sdk::GameID::MHRISE: return ((W::mhrise*)(w))->borderless_size.sub; \
126127
case sdk::GameID::GGR: \
127128
case sdk::GameID::RE8: return ((W::re8*)(w))->borderless_size.sub; \
@@ -148,9 +149,9 @@ inline float& window_borderless_h(void* w) { VIA_WIN_BORDERLESS(w, h); }
148149
inline void* sv_window(void* sv) {
149150
switch (sdk::GameIdentity::get().game()) {
150151
case sdk::GameID::RE7:
151-
case sdk::GameID::RE2: return ((SV::re2*)sv)->window;
152152
case sdk::GameID::RE3:
153-
case sdk::GameID::DMC5: return ((SV::re3*)sv)->window;
153+
case sdk::GameID::RE2: return ((SV::re2*)sv)->window;
154+
case sdk::GameID::DMC5: return ((SV::re3_tdb67*)sv)->window;
154155
case sdk::GameID::MHRISE: return ((SV::mhrise*)sv)->window;
155156
case sdk::GameID::GGR:
156157
case sdk::GameID::RE8: return ((SV::re8*)sv)->window;
@@ -171,9 +172,9 @@ inline void* sv_window(void* sv) {
171172
#define VIA_SV_SIZE(sv, sub) \
172173
switch (sdk::GameIdentity::get().game()) { \
173174
case sdk::GameID::RE7: \
174-
case sdk::GameID::RE2: return ((SV::re2*)(sv))->size.sub; \
175175
case sdk::GameID::RE3: \
176-
case sdk::GameID::DMC5: return ((SV::re3*)(sv))->size.sub; \
176+
case sdk::GameID::RE2: return ((SV::re2*)(sv))->size.sub; \
177+
case sdk::GameID::DMC5: return ((SV::re3_tdb67*)(sv))->size.sub; \
177178
case sdk::GameID::MHRISE: return ((SV::mhrise*)(sv))->size.sub; \
178179
case sdk::GameID::GGR: \
179180
case sdk::GameID::RE8: return ((SV::re8*)(sv))->size.sub; \
@@ -197,9 +198,9 @@ inline float& sv_size_h(void* sv) { VIA_SV_SIZE(sv, h); }
197198
inline int32_t& sv_display_type(void* sv) {
198199
switch (sdk::GameIdentity::get().game()) {
199200
case sdk::GameID::RE7:
200-
case sdk::GameID::RE2: return *(int32_t*)&((SV::re2*)sv)->display_type;
201201
case sdk::GameID::RE3:
202-
case sdk::GameID::DMC5: return *(int32_t*)&((SV::re3*)sv)->display_type;
202+
case sdk::GameID::RE2: return *(int32_t*)&((SV::re2*)sv)->display_type;
203+
case sdk::GameID::DMC5: return *(int32_t*)&((SV::re3_tdb67*)sv)->display_type;
203204
case sdk::GameID::MHRISE: return *(int32_t*)&((SV::mhrise*)sv)->display_type;
204205
case sdk::GameID::GGR:
205206
case sdk::GameID::RE8: return *(int32_t*)&((SV::re8*)sv)->display_type;
@@ -220,9 +221,9 @@ inline size_t sv_display_type_offset() {
220221
#define SV_DT_OFF(T) ((size_t)&((T*)nullptr)->display_type)
221222
switch (sdk::GameIdentity::get().game()) {
222223
case sdk::GameID::RE7:
223-
case sdk::GameID::RE2: return SV_DT_OFF(SV::re2);
224224
case sdk::GameID::RE3:
225-
case sdk::GameID::DMC5: return SV_DT_OFF(SV::re3);
225+
case sdk::GameID::RE2: return SV_DT_OFF(SV::re2);
226+
case sdk::GameID::DMC5: return SV_DT_OFF(SV::re3_tdb67);
226227
default: return SV_DT_OFF(SV::re9);
227228
}
228229
#undef SV_DT_OFF

src/mods/VR.cpp

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,10 @@ void VR::on_view_get_size(REManagedObject* scene_view, float* result) {
152152
auto& window_height = is_gng ? *(uint32_t*)((uintptr_t)window + 0x4C) : sdk::via::window_height(window);
153153

154154
if (is_hmd_active()) {
155-
if (gi.tdb_ver() <= 49) {
156-
if (!g_previous_size) {
157-
g_previous_size = regenny::via::Size{ (float)sdk::via::window_width(window), (float)sdk::via::window_height(window) };
158-
}
155+
if (!g_previous_size) {
156+
g_previous_size = regenny::via::Size{ (float)sdk::via::window_width(window), (float)sdk::via::window_height(window) };
159157
}
158+
160159
window_width = get_hmd_width();
161160
window_height = get_hmd_height();
162161

@@ -192,24 +191,16 @@ void VR::on_view_get_size(REManagedObject* scene_view, float* result) {
192191
} else {
193192
m_backbuffer_inconsistency = false;
194193

195-
if (gi.tdb_ver() > 49) {
196-
window_width = is_gng ? (uint32_t)*(float*)((uintptr_t)window + 0x88) : (uint32_t)sdk::via::window_borderless_w(window);
197-
window_height = is_gng ? (uint32_t)*(float*)((uintptr_t)window + 0x8C) : (uint32_t)sdk::via::window_borderless_h(window);
198-
} else {
199-
if (g_previous_size) {
200-
sdk::via::window_width(window) = (uint32_t)g_previous_size->w;
201-
sdk::via::window_height(window) = (uint32_t)g_previous_size->h;
202-
203-
g_previous_size = std::nullopt;
204-
}
205-
}
194+
window_width = (uint32_t)g_previous_size->w;
195+
window_height = (uint32_t)g_previous_size->h;
196+
g_previous_size = std::nullopt;
206197
}
207198

208199
wanted_width = (float)window_width;
209200
wanted_height = (float)window_height;
210201

211202
// Might be usable in other games too
212-
if (gi.is_sf6() || gi.tdb_ver() >= 73) {
203+
if (gi.is_sf6() || gi.tdb_ver() >= 69) {
213204
if (!is_gng) {
214205
sdk::via::window_borderless_w(window) = (float)window_width;
215206
sdk::via::window_borderless_h(window) = (float)window_height;

0 commit comments

Comments
 (0)