Skip to content

Commit 14768ba

Browse files
committed
Updated c_player_view::render_albedo
Added `e_submit_visibility_flags` Implemented `c_decal_system::render_all` Added `render_lightmap_shadows` Added `render_decorators` Implemented `c_player_view::render_albedo_decals` Implemented `c_player_view::render_first_person_albedo` Implemented `c_first_person_view::compute_visibility` Implemented `c_first_person_view::render_submit_visibility`
1 parent 227405f commit 14768ba

19 files changed

+306
-80
lines changed

game/game.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,6 +1321,7 @@ copy /b "$(ProjectDir)source\config\version.cpp" +,, "$(ProjectDir)source\config
13211321
<ClInclude Include="source\render\screen_postprocess.hpp" />
13221322
<ClInclude Include="source\render\simple_font.hpp" />
13231323
<ClInclude Include="source\render_methods\render_method_definitions.hpp" />
1324+
<ClInclude Include="source\render_methods\render_method_types.hpp" />
13241325
<ClInclude Include="source\saved_games\autosave_queue.hpp" />
13251326
<ClInclude Include="source\saved_games\content\content_item_metadata.hpp" />
13261327
<ClInclude Include="source\saved_games\game_state.hpp" />

game/game.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4595,6 +4595,9 @@
45954595
<ClInclude Include="source\interface\gui_screens\dialog\gui_screen_dialog.hpp">
45964596
<Filter>Header Files</Filter>
45974597
</ClInclude>
4598+
<ClInclude Include="source\render_methods\render_method_types.hpp">
4599+
<Filter>Header Files</Filter>
4600+
</ClInclude>
45984601
</ItemGroup>
45994602
<ItemGroup>
46004603
<ResourceCompile Include="resource\resource.rc">

game/source/_force_includes/_force_included_enums.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5536,3 +5536,13 @@ enum
55365536
k_pvs_activation_count,
55375537
};
55385538

5539+
enum e_submit_visibility_flags
5540+
{
5541+
_submit_visibility_transparents = 0,
5542+
_submit_visibility_treat_active_camo_as_opaque,
5543+
_submit_visibility_ignore_lighting,
5544+
_submit_visibility_first_person,
5545+
5546+
k_number_of_submit_visibility_flags,
5547+
};
5548+

game/source/effects/decals.cpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44
#include "game/game.hpp"
55
#include "memory/module.hpp"
66
#include "memory/thread_local.hpp"
7+
#include "rasterizer/rasterizer.hpp"
78
#include "rasterizer/rasterizer_profile.hpp"
9+
#include "render_methods/render_method_submit.hpp"
10+
11+
REFERENCE_DECLARE(0x0166E170, const s_shader_extern_info, c_decal::x_shader_extern_info);
812

913
HOOK_DECLARE_CLASS_MEMBER(0x00694430, c_decal, render);
10-
HOOK_DECLARE_CLASS(0x00694790, c_decal, render_all);
14+
//HOOK_DECLARE_CLASS(0x00694790, c_decal, render_all);
15+
HOOK_DECLARE_CLASS(0x00694810, c_decal_system, render_all);
1116
HOOK_DECLARE(0x006948C0, sub_6948C0);
1217

1318
bool disable_sub_6948C0 = true;
@@ -67,8 +72,7 @@ void __cdecl c_decal_system::prepare_for_non_bsp_zone_set_switch(const s_game_no
6772
INVOKE(0x006941B0, prepare_for_non_bsp_zone_set_switch, old_non_bsp_zone_set, new_non_bsp_zone_set, pending_zone_registry);
6873
}
6974

70-
//void __cdecl c_decal::render(c_decal_definition::e_pass) const
71-
void __thiscall c_decal::render(int32 pass)
75+
void __thiscall c_decal::render(c_decal_definition::e_pass pass)// const
7276
{
7377
//INVOKE_CLASS_MEMBER(0x00694430, c_decal, render, pass);
7478

@@ -83,14 +87,41 @@ void __thiscall c_decal::render(int32 pass)
8387
HOOK_INVOKE_CLASS_MEMBER(, c_decal, render, pass);
8488
}
8589

86-
//void __cdecl c_decal::render_all(enum c_decal_definition::e_pass)
87-
void __cdecl c_decal::render_all(int32 pass)
90+
void __cdecl c_decal::render_all(c_decal_definition::e_pass pass)
91+
{
92+
INVOKE(0x00694790, c_decal::render_all, pass);
93+
}
94+
95+
void __cdecl c_decal_system::render_all(c_decal_definition::e_pass pass)
8896
{
89-
//INVOKE(0x00694790, c_decal::render_all, pass);
97+
//INVOKE(0x00694810, c_decal_system::render_all, pass);
9098

9199
c_rasterizer_profile_scope _decals(_rasterizer_profile_element_effects, L"decals");
92100

93-
HOOK_INVOKE_CLASS(, c_decal, render_all, decltype(&c_decal::render_all), pass);
101+
c_rasterizer::set_z_buffer_mode(c_rasterizer::_z_buffer_mode_decals);
102+
c_rasterizer::set_cull_mode(c_rasterizer::_cull_mode_off);
103+
c_rasterizer::begin_high_quality_blend();
104+
if (pass == c_decal_definition::_pass_post_albedo)
105+
{
106+
c_rasterizer::set_color_write_enable(0, c_rasterizer::_color_write_enable_color);
107+
}
108+
else
109+
{
110+
c_rasterizer::set_render_target(1, c_rasterizer::_surface_normal, 0xFFFFFFFF);
111+
}
112+
render_method_submit_data(global_structure_bsp_first_active_index_get(), &c_decal::x_shader_extern_info);
113+
c_rasterizer::set_stencil_mode(c_rasterizer::_stencil_mode_decals);
114+
c_decal::render_all(pass);
115+
c_rasterizer::set_cull_mode(c_rasterizer::_cull_mode_cw);
116+
c_rasterizer::end_high_quality_blend();
117+
c_rasterizer::set_separate_alpha_blend_mode(c_rasterizer::_separate_alpha_blend_off);
118+
c_rasterizer::set_z_buffer_mode(c_rasterizer::_z_buffer_mode_write);
119+
c_rasterizer::set_alpha_blend_mode(c_rasterizer::_alpha_blend_additive);
120+
c_rasterizer::set_alpha_blend_mode(c_rasterizer::_alpha_blend_opaque);
121+
c_rasterizer::set_render_target(1, c_rasterizer::_surface_none, 0xFFFFFFFF);
122+
c_rasterizer::set_stencil_mode(c_rasterizer::_stencil_mode_off);
123+
c_rasterizer::set_color_write_enable(0, c_rasterizer::_color_write_enable_color);
124+
render_method_submit_valid(false);
94125
}
95126

96127
//.text:00695030 ; public: void __cdecl c_decal::submit() const

game/source/effects/decals.hpp

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,55 @@
33
#include "cseries/cseries.hpp"
44
#include "multithreading/message_queue.hpp"
55
#include "rasterizer/rasterizer_vertex_definitions.hpp"
6+
#include "render/render_objects_static_lighting.hpp"
7+
#include "render_methods/render_method_types.hpp"
8+
9+
class c_decal_definition
10+
{
11+
public:
12+
enum
13+
{
14+
k_max_on_disk_flags = 0,
15+
16+
17+
_specular_modulate_bit = 0,
18+
_bump_modulate_bit,
19+
_has_sprite_bit,
20+
_debug_border_color_white_bit,
21+
22+
k_max_flags,
23+
};
24+
25+
enum e_pass
26+
{
27+
_pass_post_albedo = 0,
28+
_pass_post_static_lighting,
29+
30+
k_max_pass,
31+
};
32+
33+
static real32 x_cull_angle_min;
34+
static real32 x_clamp_angle_max;
35+
static real32 x_clamp_angle_default;
36+
static real32 x_cull_angle_default;
37+
38+
//private:
39+
int32 m_name;
40+
uns32 m_flags;
41+
c_render_method_shader_decal m_shader;
42+
real32 m_radius_min;
43+
real32 m_radius_max;
44+
real32 m_decay_min;
45+
real32 m_decay_max;
46+
real32 m_lifespan_min;
47+
real32 m_lifespan_max;
48+
real32 m_clamp_angle;
49+
real32 m_cull_angle;
50+
e_pass m_pass;
51+
real32 m_specular_multiplier;
52+
real32 m_bitmap_aspect;
53+
};
54+
static_assert(sizeof(c_decal_definition) == 0x74);
655

756
struct s_game_non_bsp_zone_set;
857
struct s_game_cluster_bit_vectors;
@@ -22,6 +71,7 @@ class c_decal_system :
2271
static void __cdecl initialize_for_new_map();
2372
static void __cdecl initialize_for_new_structure_bsp(uns32 activating_structure_bsp_mask);
2473
static void __cdecl prepare_for_non_bsp_zone_set_switch(const s_game_non_bsp_zone_set* old_non_bsp_zone_set, const s_game_non_bsp_zone_set* new_non_bsp_zone_set, c_scenario_resource_registry* pending_zone_registry);
74+
static void __cdecl render_all(c_decal_definition::e_pass pass);
2575
static void __cdecl submit_all();
2676

2777
//private:
@@ -47,8 +97,8 @@ class c_decal :
4797
public s_datum_header
4898
{
4999
public:
50-
void __thiscall render(int32 pass);
51-
static void __cdecl render_all(int32 pass);
100+
void __thiscall render(c_decal_definition::e_pass pass);// const;
101+
static void __cdecl render_all(c_decal_definition::e_pass pass);
52102

53103
int32 m_definition_block_index;
54104
int32 m_parent_system_index;
@@ -66,6 +116,8 @@ class c_decal :
66116
real_point2d m_sprite_corner;
67117
real_vector2d m_sprite_size;
68118
rasterizer_vertex_world m_floating_vertices[4];
119+
120+
static const s_shader_extern_info& x_shader_extern_info;
69121
};
70122
static_assert(sizeof(c_decal) == 0x130);
71123

game/source/effects/effects.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#include "cseries/cseries.hpp"
44
#include "effects/beams.hpp"
55
#include "effects/contrails.hpp"
6-
#include "effects/decals.hpp"
76
#include "effects/light_volumes.hpp"
87
#include "effects/particle.hpp"
98
#include "effects/particle_emitter.hpp"

game/source/hs/hs_globals_external.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "render/render_debug_commands.hpp"
4040
#include "render/render_lights.hpp"
4141
#include "render/render_objects_static_lighting.hpp"
42+
#include "render/render_structure.hpp"
4243
#include "render/render_transparents.hpp"
4344
#include "render/render_water.hpp"
4445
#include "render/screen_postprocess.hpp"
@@ -1053,10 +1054,10 @@ EXTERNAL_GLOBAL_DECLARE2(
10531054
_hs_type_boolean,
10541055
NULL, // $TODO write the global chuckle nuts
10551056
);
1056-
EXTERNAL_GLOBAL_DECLARE2(
1057+
EXTERNAL_GLOBAL_DECLARE(
10571058
render_lightmap_shadows,
10581059
_hs_type_boolean,
1059-
0x0191342C, // $TODO write the global chuckle nuts
1060+
&render_lightmap_shadows_enabled, // 0x0191342C,
10601061
);
10611062
EXTERNAL_GLOBAL_DECLARE2(
10621063
render_lightmap_shadows_apply,
@@ -1173,10 +1174,10 @@ EXTERNAL_GLOBAL_DECLARE2(
11731174
_hs_type_boolean,
11741175
NULL, // $TODO write the global chuckle nuts
11751176
);
1176-
EXTERNAL_GLOBAL_DECLARE2(
1177+
EXTERNAL_GLOBAL_DECLARE(
11771178
render_decorators,
11781179
_hs_type_boolean,
1179-
NULL, // $TODO write the global chuckle nuts
1180+
&g_render_decorators,
11801181
);
11811182
EXTERNAL_GLOBAL_DECLARE2(
11821183
light_decorators,

game/source/memory/thread_local.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "cutscene/cinematics.hpp"
1212
#include "cutscene/recorded_animations.hpp"
1313
#include "devices/devices.hpp"
14+
#include "effects/decals.hpp"
1415
#include "effects/effects.hpp"
1516
#include "game/campaign_metagame.hpp"
1617
#include "game/game.hpp"

game/source/render/render_objects.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,17 @@ HOOK_DECLARE_CLASS(0x00A78410, c_object_renderer, render_albedo);
1212
//.text:00A78140 ; public: static void __cdecl c_object_renderer::initialize()
1313
//.text:00A781A0 ; public: static void __cdecl c_render_flags::or_window_bit(c_render_flags::e_window_bit, uns32)
1414
//.text:00A781C0 ; void __cdecl override_shield_impact_parameters(int32, const s_shield_impact_parameters*)
15-
//.text:00A781F0 ; public: static void __cdecl c_object_renderer::pop_marker()
16-
//.text:00A78230 ; public: static void __cdecl c_object_renderer::push_marker()
15+
16+
void __cdecl c_object_renderer::pop_marker()
17+
{
18+
INVOKE(0x00A781F0, c_object_renderer::pop_marker);
19+
}
20+
21+
void __cdecl c_object_renderer::push_marker()
22+
{
23+
INVOKE(0x00A78230, c_object_renderer::push_marker);
24+
}
25+
1726
//.text:00A78280 ; public: static void __cdecl c_object_renderer::render_active_camo_object_context(const void*, int32)
1827

1928
void __cdecl c_object_renderer::render_albedo(uns32 mesh_part_flags)
@@ -37,7 +46,11 @@ void __cdecl c_object_renderer::render_albedo(uns32 mesh_part_flags)
3746
widgets_render_unattached(_entry_point_albedo);
3847
}
3948

40-
//.text:00A78470 ; public: static void __cdecl c_object_renderer::render_albedo_decals()
49+
void __cdecl c_object_renderer::render_albedo_decals()
50+
{
51+
INVOKE(0x00A78470, c_object_renderer::render_albedo_decals);
52+
}
53+
4154
//.text:00A78480 ;
4255
//.text:00A784F0 ; public: static void __cdecl c_object_renderer::render_lights(e_entry_point)
4356
//.text:00A78530 ; public: static void __cdecl c_object_renderer::render_object_context(int32, e_entry_point, int32, bool)
@@ -82,5 +95,9 @@ void __cdecl c_object_renderer::submit_and_render_sky(int32 entry_point_type, in
8295
//.text:00A79DE0 ; public: static void __cdecl c_object_renderer::submit_object_mesh_parts(s_object_render_context*, s_visible_object_render_visibility*, int32, bool, bool, bool, bool)
8396
//.text:00A7A280 ; public: static void __cdecl c_object_renderer::submit_object_mesh_parts_for_active_camo(s_object_render_context*, s_visible_object_render_visibility*, bool, bool)
8497
//.text:00A7A4F0 ;
85-
//.text:00A7A510 ; public: static void __cdecl c_object_renderer::submit_visibility(uns32)
98+
99+
void __cdecl c_object_renderer::submit_visibility(uns32 submit_visibility_flags)
100+
{
101+
INVOKE(0x00A7A510, c_object_renderer::submit_visibility, submit_visibility_flags);
102+
}
86103

game/source/render/render_objects.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,13 @@ static_assert(sizeof(s_render_object_globals) == 0x3C040);
5353
class c_object_renderer
5454
{
5555
public:
56+
static void __cdecl pop_marker();
57+
static void __cdecl push_marker();
5658
static void __cdecl render_albedo(uns32 flags);
59+
static void __cdecl render_albedo_decals();
5760
static void __cdecl render_object_contexts(e_entry_point entry_point, int32 mesh_part_mask);
5861
static void __cdecl render_object_widgets(e_entry_point entry_point);
5962
static void __cdecl submit_and_render_sky(int32 entry_point_type, int32 player_window_index);
63+
static void __cdecl submit_visibility(uns32 submit_visibility_flags);
6064
};
6165

0 commit comments

Comments
 (0)