Skip to content

Commit 5789ca9

Browse files
committed
Impl c_gui_bitmap_widget::assemble_render_data
1 parent 9aff25d commit 5789ca9

File tree

2 files changed

+127
-24
lines changed

2 files changed

+127
-24
lines changed

game/source/interface/c_gui_bitmap_widget.cpp

Lines changed: 119 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22

33
#include "bitmaps/bitmap_group.hpp"
44
#include "gui_custom_bitmap_storage.hpp"
5+
#include "interface/c_controller.hpp"
6+
#include "interface/c_gui_list_widget.hpp"
7+
#include "interface/c_gui_screen_widget.hpp"
58
#include "interface/interface_constants.hpp"
9+
#include "interface/user_interface_data.hpp"
10+
#include "math/color_math.hpp"
611
#include "memory/module.hpp"
712
#include "rasterizer/rasterizer.hpp"
813
#include "render/screen_postprocess.hpp"
914

15+
HOOK_DECLARE_CLASS_MEMBER(0x00B167B0, c_gui_bitmap_widget, assemble_render_data_);
1016
HOOK_DECLARE(0x00B170F0, render_bitmap);
1117

1218
//.text:00B16670 ; public: __cdecl c_gui_bitmap_widget::c_gui_bitmap_widget()
@@ -18,7 +24,114 @@ HOOK_DECLARE(0x00B170F0, render_bitmap);
1824

1925
//.text:00B166E0 ; public: static void __cdecl c_gui_bitmap_widget::add_definition_fields(s_bitmap_widget_definition const*, s_runtime_bitmap_widget_definition*, real_rectangle2d*, bool)
2026
//.text:00B16760 ; public: static void __cdecl c_gui_bitmap_widget::assemble_definition(s_bitmap_widget_block const*, s_runtime_bitmap_widget_definition*, real_rectangle2d*)
21-
//.text:00B167B0 ; public: virtual void __cdecl c_gui_bitmap_widget::assemble_render_data(s_gui_widget_render_data*, rectangle2d const*, e_controller_index, int32, bool, bool, bool)
27+
28+
void __thiscall c_gui_bitmap_widget::assemble_render_data_(
29+
s_gui_bitmap_widget_render_data* render_data,
30+
rectangle2d* window_bounds,
31+
e_controller_index local_controller_index,
32+
bool apply_translation,
33+
bool apply_scale,
34+
bool apply_rotation)
35+
{
36+
//INVOKE_CLASS_MEMBER(0x00B167B0, c_gui_bitmap_widget, assemble_render_data,
37+
// render_data,
38+
// window_bounds,
39+
// local_controller_index,
40+
// apply_translation,
41+
// apply_scale,
42+
// apply_rotation);
43+
44+
c_gui_widget::assemble_render_data(
45+
render_data,
46+
window_bounds,
47+
local_controller_index,
48+
apply_translation,
49+
apply_scale,
50+
apply_rotation);
51+
//INVOKE_CLASS_MEMBER(0x00AB7330, c_gui_widget, assemble_render_data,
52+
// render_data,
53+
// window_bounds,
54+
// local_controller_index,
55+
// apply_translation,
56+
// apply_scale,
57+
// apply_rotation);
58+
59+
bool render_blurred_back_buffer = TEST_BIT(m_definition.flags, 4);
60+
render_data->flags.set(s_gui_widget_render_data::_render_blurred_back_buffer_bit, render_blurred_back_buffer);
61+
62+
bool render_as_player_emblem = TEST_BIT(m_definition.flags, 5);
63+
render_data->flags.set(s_gui_widget_render_data::_render_as_player_emblem_bit, render_as_player_emblem);
64+
65+
if (m_override_sprite_bitmap_index != NONE)
66+
{
67+
render_data->bitmap_definition_index = m_override_sprite_bitmap_index;
68+
}
69+
else
70+
{
71+
render_data->bitmap_definition_index = m_definition.bitmap_reference_index;
72+
}
73+
74+
if (render_blurred_back_buffer)
75+
{
76+
real_rectangle2d pin_bounds
77+
{
78+
.x0 = (real32)window_bounds->x0,
79+
.x1 = (real32)window_bounds->x1,
80+
.y0 = (real32)window_bounds->y0,
81+
.y1 = (real32)window_bounds->y1,
82+
};
83+
render_data->projected_bounds.pin(&pin_bounds);
84+
}
85+
else if (render_as_player_emblem)
86+
{
87+
c_gui_screen_widget* parent_screen = get_parent_screen();
88+
ASSERT(parent_screen != NULL);
89+
90+
bool emblem_info_valid = false;// parent_screen->try_and_get_render_data_emblem_info(&render_data->source.emblem);
91+
if (!emblem_info_valid)
92+
{
93+
s_player_appearance player_appearance{};
94+
95+
if (get_element_handle() != NONE)
96+
{
97+
if (c_gui_list_widget* parent_list = get_parent_list())
98+
{
99+
if (c_gui_data* data = parent_list->get_data())
100+
{
101+
//emblem_info_valid = data->get_player_appearance(get_element_handle(), &player_appearance);
102+
103+
render_data->source.emblem = controller_get(_controller0)->get_player_profile_interface()->get_emblem_info();
104+
emblem_info_valid = true;
105+
}
106+
}
107+
}
108+
109+
if (emblem_info_valid)
110+
{
111+
render_data->source.emblem = player_appearance.emblem_info;
112+
}
113+
else if (VALID_CONTROLLER(render_data->local_controller_index))
114+
{
115+
render_data->source.emblem = controller_get(render_data->local_controller_index)->get_player_profile_interface()->get_emblem_info();
116+
emblem_info_valid = true;
117+
}
118+
}
119+
120+
render_data->flags.set(s_gui_widget_render_data::_emblem_info_valid_bit, emblem_info_valid);
121+
}
122+
else
123+
{
124+
render_data->source.sprite.sequence = m_animated_state.bitmap_sprite_sequence;
125+
render_data->source.sprite.frame = m_animated_state.bitmap_sprite_frame;
126+
}
127+
128+
real_argb_color argb_tint_color{};
129+
render_data->argb_tint = real_argb_color_to_pixel32(get_cumulative_color_tint(&argb_tint_color));
130+
render_data->texture_uv_offset = m_animated_state.texture_uv;
131+
render_data->frame_buffer_blend_function = MIN(MAX(m_definition.render_blend_mode, 0), 12);
132+
render_data->explicit_shader_index = m_definition.explicit_shader_reference_index;
133+
}
134+
22135
//.text:00B168F0 ; public: virtual bool __cdecl c_gui_bitmap_widget::can_receive_focus()
23136

24137
//e_animation_state c_gui_bitmap_widget::get_ambient_state()
@@ -162,24 +275,10 @@ void __cdecl render_bitmap(s_gui_bitmap_widget_render_data const* render_data, r
162275
}
163276
else if (render_data->flags.test(s_gui_widget_render_data::_render_as_player_emblem_bit))
164277
{
165-
int16 background_emblem_index = 0;
166-
int16 foreground_emblem_index = 0;
167-
168-
bool v39 = false;
169-
if (VALID_CONTROLLER(render_data->local_controller_index))
170-
{
171-
v39 = emblem_set_render_constants_for_local_user(render_data->local_controller_index, &foreground_emblem_index, &background_emblem_index);
172-
}
173-
else
174-
{
175-
v39 = emblem_set_render_constants_for_local_user(render_data->local_controller_index, &foreground_emblem_index, &background_emblem_index);
176-
}
177-
178-
///*render_data->flags.test(s_gui_widget_render_data::_emblem_info_valid_bit) &&*/ emblem_set_render_constants_from_user_interface(&render_data->source.emblem)
179-
if (v39)
278+
if (render_data->flags.test(s_gui_widget_render_data::_emblem_info_valid_bit) && emblem_set_render_constants_from_user_interface(&render_data->source.emblem))
180279
{
181-
get_bitmap_and_hardware_format(render_data->bitmap_definition_index, 0, background_emblem_index, &hardware_format_primary);
182-
get_bitmap_and_hardware_format(render_data->bitmap_definition_index, 0, foreground_emblem_index, &hardware_format_secondary);
280+
get_bitmap_and_hardware_format(render_data->bitmap_definition_index, 0, render_data->source.emblem.background_emblem_index, &hardware_format_primary);
281+
get_bitmap_and_hardware_format(render_data->bitmap_definition_index, 0, render_data->source.emblem.foreground_emblem_index, &hardware_format_secondary);
183282
explicit_shader_index = c_rasterizer_globals::_shader_player_emblem_screen;
184283
}
185284
}
@@ -300,12 +399,12 @@ void __cdecl render_bitmap(s_gui_bitmap_widget_render_data const* render_data, r
300399

301400
void c_gui_bitmap_widget::set_sprite_frame(int32 sprite_frame)
302401
{
303-
m_sprite_frame = sprite_frame;
402+
m_override_sprite_frame = sprite_frame;
304403
}
305404

306405
void c_gui_bitmap_widget::set_sprite_sequence(int32 sprite_sequence)
307406
{
308-
m_sprite_sequence = sprite_sequence;
407+
m_override_sprite_sequence = sprite_sequence;
309408
}
310409

311410
//.text:00B17690 ; public: virtual void __cdecl c_gui_bitmap_widget::update_render_state(uns32)

game/source/interface/c_gui_bitmap_widget.hpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,13 @@ struct s_runtime_bitmap_widget_definition :
4949
static_assert(sizeof(s_runtime_bitmap_widget_definition) == sizeof(s_runtime_core_widget_definition) + 0x18);
5050

5151
struct bitmap_data;
52+
struct s_gui_bitmap_widget_render_data;
5253
struct c_gui_bitmap_widget :
5354
public c_gui_widget
5455
{
56+
public:
57+
void __thiscall assemble_render_data_(s_gui_bitmap_widget_render_data* render_data, rectangle2d* window_bounds, e_controller_index local_controller_index, bool apply_translation, bool apply_scale, bool apply_rotation);
58+
5559
protected:
5660
//virtual e_animation_state get_ambient_state();
5761

@@ -73,10 +77,10 @@ struct c_gui_bitmap_widget :
7377

7478
protected:
7579
int32 __unknownDC;
76-
int32 m_bitmap_tag_reference_index;
77-
int32 m_sprite_frame;
78-
int32 m_sprite_sequence;
79-
s_runtime_bitmap_widget_definition m_core_definition;
80+
int32 m_override_sprite_bitmap_index;
81+
int32 m_override_sprite_frame;
82+
int32 m_override_sprite_sequence;
83+
s_runtime_bitmap_widget_definition m_definition;
8084
};
8185
static_assert(sizeof(c_gui_bitmap_widget) == 0x138);
8286

0 commit comments

Comments
 (0)