Skip to content

Commit 4db776f

Browse files
committed
Fix Apollo Justice VR GUI placement
1 parent 7f19b98 commit 4db776f

4 files changed

Lines changed: 105 additions & 46 deletions

File tree

shared/sdk/REComponent.hpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,23 @@
44

55
namespace utility::re_component {
66
static auto get_game_object(::REComponent* comp) {
7-
//return utility::re_managed_object::get_field<::REGameObject*>(comp, "GameObject");
8-
return comp->ownerGameObject;
7+
if (comp == nullptr) {
8+
return (::REGameObject*)nullptr;
9+
}
10+
11+
if (comp->ownerGameObject != nullptr) {
12+
return comp->ownerGameObject;
13+
}
14+
15+
if (auto reflected = utility::re_managed_object::get_field<::REGameObject*>(comp, "GameObject"); reflected != nullptr) {
16+
return reflected;
17+
}
18+
19+
if (auto reflected = utility::re_managed_object::get_field<::REGameObject*>(comp, "OwnerGameObject"); reflected != nullptr) {
20+
return reflected;
21+
}
22+
23+
return utility::re_managed_object::get_field<::REGameObject*>(comp, "_OwnerGameObject_k__BackingField");
924
}
1025

1126
static auto get_valid(::REComponent* comp) {
@@ -73,4 +88,4 @@ namespace utility::re_component {
7388
7489
return (T *)ret->params.out_data;
7590
}*/
76-
}
91+
}

shared/sdk/REGameObject.cpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,35 @@ std::string get_name(REGameObject* obj) {
2727
// this offset might change between versions.
2828
return utility::re_string::get_string(obj->name);
2929
}
30-
}
30+
31+
RETransform* get_transform(REGameObject* obj) {
32+
if (obj == nullptr) {
33+
return nullptr;
34+
}
35+
36+
static const auto game_object_t = sdk::find_type_definition("via.GameObject");
37+
static const auto get_transform_fn = game_object_t != nullptr ? game_object_t->get_method("get_Transform") : nullptr;
38+
static const auto transform_field = game_object_t != nullptr ? game_object_t->get_field("Transform") : nullptr;
39+
static const auto transform_field_lower = game_object_t != nullptr ? game_object_t->get_field("transform") : nullptr;
40+
41+
if (get_transform_fn != nullptr) {
42+
if (auto transform = get_transform_fn->call<::RETransform*>(sdk::get_thread_context(), obj); transform != nullptr) {
43+
return transform;
44+
}
45+
}
46+
47+
if (transform_field != nullptr) {
48+
if (auto transform = transform_field->get_data<::RETransform*>(obj); transform != nullptr) {
49+
return transform;
50+
}
51+
}
52+
53+
if (transform_field_lower != nullptr) {
54+
if (auto transform = transform_field_lower->get_data<::RETransform*>(obj); transform != nullptr) {
55+
return transform;
56+
}
57+
}
58+
59+
return obj->transform;
60+
}
61+
}

shared/sdk/REGameObject.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
namespace utility {
66
namespace re_game_object {
77
std::string get_name(::REGameObject* obj);
8+
::RETransform* get_transform(::REGameObject* obj);
9+
}
810
}
9-
}

src/mods/VR.cpp

Lines changed: 53 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,10 @@ void VR::on_view_get_size(REManagedObject* scene_view, float* result) {
220220
// but rather update the current scene view's size directly.
221221
regenny_view->size.w = wanted_width;
222222
regenny_view->size.h = wanted_height;
223-
//regenny_view->custom_display_size.w = wanted_width;
224-
//regenny_view->custom_display_size.h = wanted_height;
225-
//regenny_view->present_rect.w = wanted_width;
226-
//regenny_view->present_rect.h = wanted_height;
223+
regenny_view->custom_display_size.w = wanted_width;
224+
regenny_view->custom_display_size.h = wanted_height;
225+
regenny_view->present_rect.w = wanted_width;
226+
regenny_view->present_rect.h = wanted_height;
227227
#endif
228228
}
229229

@@ -1402,9 +1402,11 @@ void VR::update_hmd_state() {
14021402
// if this is not done, the left eye will jitter a lot
14031403
#if defined(RE2) || defined(RE3)
14041404
auto camera = sdk::get_primary_camera();
1405+
auto camera_game_object = utility::re_component::get_game_object(camera);
1406+
auto camera_transform = utility::re_game_object::get_transform(camera_game_object);
14051407

1406-
if (camera != nullptr && camera->ownerGameObject != nullptr && camera->ownerGameObject->transform != nullptr) {
1407-
FirstPerson::get()->on_update_transform(camera->ownerGameObject->transform);
1408+
if (camera_transform != nullptr) {
1409+
FirstPerson::get()->on_update_transform(camera_transform);
14081410
}
14091411
#endif
14101412
}
@@ -1493,12 +1495,13 @@ void VR::update_camera() {
14931495
m_needs_camera_restore = false;
14941496

14951497
auto camera_object = utility::re_component::get_game_object(camera);
1498+
auto camera_transform = utility::re_game_object::get_transform(camera_object);
14961499

1497-
if (camera_object == nullptr || camera_object->transform == nullptr) {
1500+
if (camera_transform == nullptr) {
14981501
return;
14991502
}
15001503

1501-
auto camera_joint = utility::re_transform::get_joint(*camera_object->transform, 0);
1504+
auto camera_joint = utility::re_transform::get_joint(*camera_transform, 0);
15021505

15031506
if (camera_joint == nullptr) {
15041507
return;
@@ -1552,14 +1555,15 @@ void VR::update_camera_origin() {
15521555
}
15531556

15541557
auto camera_object = utility::re_component::get_game_object(camera);
1558+
auto camera_transform = utility::re_game_object::get_transform(camera_object);
15551559

1556-
if (camera_object == nullptr || camera_object->transform == nullptr) {
1560+
if (camera_transform == nullptr) {
15571561
spdlog::error("VR: Failed to get camera game object or transform!");
15581562
m_needs_camera_restore = false;
15591563
return;
15601564
}
15611565

1562-
auto camera_joint = utility::re_transform::get_joint(*camera_object->transform, 0);
1566+
auto camera_joint = utility::re_transform::get_joint(*camera_transform, 0);
15631567

15641568
if (camera_joint == nullptr) {
15651569
spdlog::error("VR: Failed to get camera joint!");
@@ -1653,12 +1657,13 @@ void VR::update_audio_camera() {
16531657
}
16541658

16551659
auto camera_object = utility::re_component::get_game_object(camera);
1660+
auto camera_transform = utility::re_game_object::get_transform(camera_object);
16561661

1657-
if (camera_object == nullptr || camera_object->transform == nullptr) {
1662+
if (camera_transform == nullptr) {
16581663
return;
16591664
}
16601665

1661-
auto camera_joint = utility::re_transform::get_joint(*camera_object->transform, 0);
1666+
auto camera_joint = utility::re_transform::get_joint(*camera_transform, 0);
16621667

16631668
if (camera_joint == nullptr) {
16641669
return;
@@ -1688,12 +1693,13 @@ void VR::update_render_matrix() {
16881693
}
16891694

16901695
auto camera_object = utility::re_component::get_game_object(camera);
1696+
auto camera_transform = utility::re_game_object::get_transform(camera_object);
16911697

1692-
if (camera_object == nullptr || camera_object->transform == nullptr) {
1698+
if (camera_transform == nullptr) {
16931699
return;
16941700
}
16951701

1696-
auto camera_joint = utility::re_transform::get_joint(*camera_object->transform, 0);
1702+
auto camera_joint = utility::re_transform::get_joint(*camera_transform, 0);
16971703

16981704
if (camera_joint == nullptr) {
16991705
return;
@@ -1723,15 +1729,16 @@ void VR::restore_audio_camera() {
17231729
}
17241730

17251731
auto camera_object = utility::re_component::get_game_object(camera);
1732+
auto camera_transform = utility::re_game_object::get_transform(camera_object);
17261733

1727-
if (camera_object == nullptr || camera_object->transform == nullptr) {
1734+
if (camera_transform == nullptr) {
17281735
m_needs_audio_restore = false;
17291736
return;
17301737
}
17311738

1732-
//camera_object->transform->worldTransform = m_original_camera_matrix;
1739+
//camera_transform->worldTransform = m_original_camera_matrix;
17331740

1734-
auto joint = utility::re_transform::get_joint(*camera_object->transform, 0);
1741+
auto joint = utility::re_transform::get_joint(*camera_transform, 0);
17351742

17361743
if (joint == nullptr) {
17371744
m_needs_audio_restore = false;
@@ -1764,15 +1771,16 @@ void VR::restore_camera() {
17641771
}
17651772

17661773
auto camera_object = utility::re_component::get_game_object(camera);
1774+
auto camera_transform = utility::re_game_object::get_transform(camera_object);
17671775

1768-
if (camera_object == nullptr || camera_object->transform == nullptr) {
1776+
if (camera_transform == nullptr) {
17691777
m_needs_camera_restore = false;
17701778
return;
17711779
}
17721780

1773-
//camera_object->transform->worldTransform = m_original_camera_matrix;
1781+
//camera_transform->worldTransform = m_original_camera_matrix;
17741782

1775-
auto joint = utility::re_transform::get_joint(*camera_object->transform, 0);
1783+
auto joint = utility::re_transform::get_joint(*camera_transform, 0);
17761784

17771785
if (joint == nullptr) {
17781786
m_needs_camera_restore = false;
@@ -2348,6 +2356,7 @@ struct GUIRestoreData {
23482356
REComponent* element{nullptr};
23492357
REComponent* view{nullptr};
23502358
Vector4f original_position{ 0.0f, 0.0f, 0.0f, 1.0f };
2359+
Matrix4x4f original_world_matrix{};
23512360
via::gui::ViewType view_type{ via::gui::ViewType::Screen };
23522361
bool overlay{false};
23532362
bool detonemap{true};
@@ -2364,7 +2373,9 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
23642373

23652374
auto game_object = utility::re_component::get_game_object(gui_element);
23662375

2367-
if (game_object != nullptr && game_object->transform != nullptr) {
2376+
auto game_object_transform = utility::re_game_object::get_transform(game_object);
2377+
2378+
if (game_object != nullptr && game_object_transform != nullptr) {
23682379
auto context = sdk::get_thread_context();
23692380

23702381
const auto name = utility::re_game_object::get_name(game_object);
@@ -2464,7 +2475,7 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
24642475
// we don't want to mess with any game object that has a mesh
24652476
// because it might be something physical in the game world
24662477
// that the player can interact with
2467-
if (utility::re_component::find(game_object->transform, via_render_mesh_typedef->get_type()) != nullptr) {
2478+
if (utility::re_component::find(game_object_transform, via_render_mesh_typedef->get_type()) != nullptr) {
24682479
return true;
24692480
}
24702481

@@ -2476,11 +2487,12 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
24762487
const auto world_ui_scale = m_world_ui_scale_option->value();
24772488

24782489
auto& restore_data = g_elements_to_reset.emplace_back(std::make_unique<GUIRestoreData>());
2479-
auto original_game_object_pos = sdk::get_transform_position(game_object->transform);
2490+
auto original_game_object_pos = sdk::get_transform_position(game_object_transform);
24802491

24812492
restore_data->element = gui_element;
24822493
restore_data->view = view;
24832494
restore_data->original_position = original_game_object_pos;
2495+
restore_data->original_world_matrix = game_object_transform->worldTransform;
24842496
restore_data->overlay = sdk::call_object_func<bool>(view, "get_Overlay", context, view);
24852497
restore_data->detonemap = sdk::call_object_func<bool>(view, "get_Detonemap", context, view);
24862498
restore_data->view_type = (via::gui::ViewType)current_view_type;
@@ -2511,9 +2523,10 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
25112523
// Set the gui element's position to be in front of the camera
25122524
if (camera != nullptr) {
25132525
auto camera_object = utility::re_component::get_game_object(camera);
2526+
auto camera_transform = utility::re_game_object::get_transform(camera_object);
25142527

2515-
if (camera_object != nullptr && camera_object->transform != nullptr) {
2516-
auto& gui_matrix = game_object->transform->worldTransform;
2528+
if (camera_transform != nullptr) {
2529+
auto& gui_matrix = game_object_transform->worldTransform;
25172530
auto child = sdk::call_object_func<REManagedObject*>(view, "get_Child", context, view);
25182531

25192532
auto fix_2d_position = [&](const Vector4f& target_position,
@@ -2543,8 +2556,8 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
25432556
// LESSON: DO NOT CALL THESE METHODS ON THE TRANSFORM!
25442557
// THEY CAUSE SOME STRANGE BUGS WHEN THE GUI ELEMENT HAS A PARENT TRANSFORM!
25452558
// THE GUI RENDERING FUNCTIONS PERFORM ON THE WORLD MATRIX, SO THIS IS NOT NECESSARY.
2546-
//sdk::set_transform_position(game_object->transform, new_pos);
2547-
//sdk::set_transform_rotation(game_object->transform, look_rot);
2559+
//sdk::set_transform_position(game_object_transform, new_pos);
2560+
//sdk::set_transform_rotation(game_object_transform, look_rot);
25482561

25492562
const auto scaled_ui_scale = *custom_ui_scale * 0.01f;
25502563
const auto distance = glm::length(delta);
@@ -2586,7 +2599,7 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
25862599
// Fix for other kinds of world pos attach elements.
25872600
#ifdef RE7
25882601
if (name_hash == "InteractOperationCursor"_fnv) {
2589-
auto world_pos_attach_comp = utility::re_component::find(game_object->transform, ui_world_pos_attach_typedef->get_type());
2602+
auto world_pos_attach_comp = utility::re_component::find(game_object_transform, ui_world_pos_attach_typedef->get_type());
25902603

25912604
// Fix the world position of the gui element
25922605
if (world_pos_attach_comp != nullptr) {
@@ -2607,8 +2620,6 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
26072620
gui_matrix = glm::scale(gui_matrix, Vector3f{ scale, scale, scale });
26082621
};
26092622

2610-
auto camera_transform = camera_object->transform;
2611-
26122623
const auto& camera_matrix = m_original_camera_matrix;
26132624
const auto& camera_position = camera_matrix[3];
26142625

@@ -2751,15 +2762,16 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
27512762

27522763
fix_2d_position(original_game_object_pos);
27532764
} else if(gui_driver_typedef != nullptr) { // RE8
2754-
auto interact_icon_comp = utility::re_component::find(game_object->transform, gui_driver_typedef->get_type());
2765+
auto interact_icon_comp = utility::re_component::find(game_object_transform, gui_driver_typedef->get_type());
27552766

27562767
if (interact_icon_comp != nullptr) {
27572768
auto interact_icon_object = sdk::call_object_func<REGameObject*>(interact_icon_comp, "get_attachTarget", context, interact_icon_comp);
2769+
auto interact_icon_transform = utility::re_game_object::get_transform(interact_icon_object);
27582770

2759-
if (interact_icon_object != nullptr && interact_icon_object->transform != nullptr) {
2771+
if (interact_icon_transform != nullptr) {
27602772
// call get_Position on the object
27612773
Vector4f interact_icon_position{};
2762-
sdk::call_object_func<Vector4f*>(interact_icon_object->transform, "get_Position", &interact_icon_position, context, interact_icon_object->transform);
2774+
sdk::call_object_func<Vector4f*>(interact_icon_transform, "get_Position", &interact_icon_position, context, interact_icon_transform);
27632775

27642776
fix_2d_position(interact_icon_position);
27652777
}
@@ -2771,14 +2783,14 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
27712783
continue;
27722784
}
27732785

2774-
auto element_comp = utility::re_component::find(game_object->transform, element_type->get_type());
2786+
auto element_comp = utility::re_component::find(game_object_transform, element_type->get_type());
27752787

27762788
if (element_comp == nullptr) {
27772789
continue;
27782790
}
27792791

2780-
static auto get_parent_method = sdk::get_object_method(game_object->transform, "get_Parent");
2781-
auto parent = get_parent_method->call<::RETransform*>(context, game_object->transform);
2792+
static auto get_parent_method = sdk::get_object_method(game_object_transform, "get_Parent");
2793+
auto parent = get_parent_method->call<::RETransform*>(context, game_object_transform);
27822794

27832795
if (parent != nullptr) {
27842796
Vector4f offset{};
@@ -2851,7 +2863,7 @@ bool VR::on_pre_gui_draw_element(REComponent* gui_element, void* primitive_conte
28512863

28522864
// ... RE7
28532865
#ifdef RE7
2854-
auto world_pos_attach_comp = utility::re_component::find(game_object->transform, ui_world_pos_attach_typedef->get_type());
2866+
auto world_pos_attach_comp = utility::re_component::find(game_object_transform, ui_world_pos_attach_typedef->get_type());
28552867

28562868
// Fix the world position of the gui element
28572869
if (world_pos_attach_comp != nullptr) {
@@ -2884,11 +2896,11 @@ void VR::on_gui_draw_element(REComponent* gui_element, void* primitive_context)
28842896

28852897
auto game_object = utility::re_component::get_game_object(data->element);
28862898

2887-
if (game_object != nullptr && game_object->transform != nullptr) {
2888-
//sdk::set_transform_position(game_object->transform, data->original_position);
2899+
auto game_object_transform = utility::re_game_object::get_transform(game_object);
28892900

2890-
auto& gui_matrix = game_object->transform->worldTransform;
2891-
gui_matrix[3] = data->original_position;
2901+
if (game_object_transform != nullptr) {
2902+
//sdk::set_transform_position(game_object_transform, data->original_position);
2903+
game_object_transform->worldTransform = data->original_world_matrix;
28922904
}
28932905
}
28942906

0 commit comments

Comments
 (0)