From 61a185df888169d9417424ea8bcdab9d61d49b33 Mon Sep 17 00:00:00 2001
From: theTwister <6237734+twist84@users.noreply.github.com>
Date: Thu, 7 Nov 2024 12:13:57 +0000
Subject: [PATCH] Added more d3d pix events
`lightshafts`
`lens flares`
`render_misc_transparents`
`transparents`
---
game/game.vcxproj | 2 +
game/game.vcxproj.filters | 6 ++
game/source/memory/thread_local.hpp | 1 +
game/source/rasterizer/rasterizer.cpp | 15 +++-
game/source/rasterizer/rasterizer.hpp | 4 +-
.../rasterizer_occlusion_queries.cpp | 9 +++
.../rasterizer_occlusion_queries.hpp | 4 +
game/source/render/camera_fx_settings.hpp | 63 +++++++++++++--
game/source/render/render_game_state.hpp | 5 +-
game/source/render/render_lens_flares.cpp | 9 +++
game/source/render/render_lens_flares.hpp | 1 +
game/source/render/render_lights.cpp | 7 ++
game/source/render/render_transparents.cpp | 23 ++++++
game/source/render/render_transparents.hpp | 9 +++
game/source/render/screen_postprocess.cpp | 16 ++--
game/source/render/screen_postprocess.hpp | 16 +++-
.../render/views/render_player_view.cpp | 79 ++++++++++++++++++-
game/source/render/views/render_view.hpp | 5 ++
.../render_methods/render_method_submit.cpp | 11 ++-
.../render_methods/render_method_submit.hpp | 2 +
20 files changed, 264 insertions(+), 23 deletions(-)
create mode 100644 game/source/rasterizer/rasterizer_occlusion_queries.cpp
create mode 100644 game/source/rasterizer/rasterizer_occlusion_queries.hpp
diff --git a/game/game.vcxproj b/game/game.vcxproj
index 4cb02b895..9a314126b 100644
--- a/game/game.vcxproj
+++ b/game/game.vcxproj
@@ -317,6 +317,7 @@ copy /b $(ProjectDir)source\config\version.cpp +,, $(ProjectDir)source\config\ve
+
@@ -1151,6 +1152,7 @@ copy /b $(ProjectDir)source\config\version.cpp +,, $(ProjectDir)source\config\ve
+
diff --git a/game/game.vcxproj.filters b/game/game.vcxproj.filters
index fe0cfa6af..1ad9574af 100644
--- a/game/game.vcxproj.filters
+++ b/game/game.vcxproj.filters
@@ -1704,6 +1704,9 @@
Source Files
+
+ Source Files
+
@@ -3926,6 +3929,9 @@
Header Files
+
+ Header Files
+
diff --git a/game/source/memory/thread_local.hpp b/game/source/memory/thread_local.hpp
index 65099270b..29dccf733 100644
--- a/game/source/memory/thread_local.hpp
+++ b/game/source/memory/thread_local.hpp
@@ -47,6 +47,7 @@
#include "rasterizer/rasterizer_hue_saturation.hpp"
#include "rasterizer/rasterizer_implicit_geometry.hpp"
#include "rasterizer/rasterizer_main.hpp"
+#include "render/camera_fx_settings.hpp"
#include "render/depth_of_field.hpp"
#include "render/render_game_state.hpp"
#include "render/render_objects.hpp"
diff --git a/game/source/rasterizer/rasterizer.cpp b/game/source/rasterizer/rasterizer.cpp
index 296caadb6..a1764ab54 100644
--- a/game/source/rasterizer/rasterizer.cpp
+++ b/game/source/rasterizer/rasterizer.cpp
@@ -1049,6 +1049,11 @@ void __cdecl c_rasterizer::set_color_write_enable(long render_state, long render
//g_device->SetRenderState(x_last_render_state_types[render_state], render_state_value);
}
+bool __cdecl c_rasterizer::surface_valid(e_surface surface)
+{
+ return INVOKE(0x00A490E0, c_rasterizer::surface_valid, surface);
+}
+
bool __cdecl c_rasterizer::set_compiled_pixel_shader(c_rasterizer_compiled_pixel_shader const* compiled_pixel_shader, e_entry_point entry_point)
{
return INVOKE(0x00A23220, c_rasterizer::set_compiled_pixel_shader, compiled_pixel_shader, entry_point);
@@ -1523,9 +1528,10 @@ void __cdecl c_rasterizer::draw_vertices(c_rasterizer_index_buffer::e_primitive_
INVOKE(0x00A283B0, c_rasterizer::draw_vertices, primitive_type, start_vertex, primitive_count);
}
-void __cdecl c_rasterizer::resolve_entire_surface(e_surface surface, long a2)
+// nullsub
+void __cdecl c_rasterizer::resolve_entire_surface(e_surface surface, long a2, short_rectangle2d* a3, short a4, short a5)
{
- INVOKE(0x00A48C50, c_rasterizer::resolve_entire_surface, surface, a2);
+ //INVOKE(0x00A48C50, c_rasterizer::resolve_entire_surface, surface, a2, a3, a4, a5);
}
void __cdecl c_rasterizer::set_depth_stencil_surface(e_surface surface)
@@ -1538,6 +1544,11 @@ void __cdecl c_rasterizer::set_render_target(long render_target_index, e_surface
INVOKE(0x00A48E40, c_rasterizer::set_render_target, render_target_index, surface, render_state);
}
+void __cdecl c_rasterizer::set_using_albedo_sampler(bool using_albedo_sampler)
+{
+ INVOKE(0x00A48FE0, c_rasterizer::set_using_albedo_sampler, using_albedo_sampler);
+}
+
void __cdecl c_rasterizer::set_viewport(short_rectangle2d const& viewport, real min_z, real max_z)
{
//INVOKE(0x00A49010, c_rasterizer::set_viewport, viewport, z_min, z_max);
diff --git a/game/source/rasterizer/rasterizer.hpp b/game/source/rasterizer/rasterizer.hpp
index fef395770..ae026c480 100644
--- a/game/source/rasterizer/rasterizer.hpp
+++ b/game/source/rasterizer/rasterizer.hpp
@@ -323,6 +323,7 @@ struct c_rasterizer
static void __cdecl set_alpha_blend_mode(e_alpha_blend_mode);
static void __cdecl set_alpha_blend_mode_custom_device_no_cache(IDirect3DDevice9Ex*, e_alpha_blend_mode);
static void __cdecl set_color_write_enable(long, long);
+ static bool __cdecl surface_valid(e_surface surface);
static bool __cdecl set_compiled_pixel_shader(c_rasterizer_compiled_pixel_shader const*, e_entry_point);
static bool __cdecl set_compiled_vertex_shader(c_rasterizer_compiled_vertex_shader const*, e_vertex_type, e_transfer_vector_vertex_types, e_entry_point);
static void __cdecl set_cull_mode(e_cull_mode);
@@ -355,9 +356,10 @@ struct c_rasterizer
static void __cdecl draw_primitive_up(c_rasterizer_index_buffer::e_primitive_type primitive_type, dword primitive_count, void const* stream_data, dword stride);
static void __cdecl draw_vertices(c_rasterizer_index_buffer::e_primitive_type primitive_type, long start_vertex, long primitive_count);
- static void __cdecl resolve_entire_surface(e_surface surface, long a2);
+ static void __cdecl resolve_entire_surface(e_surface surface, long a2, short_rectangle2d* a3, short a4, short a5);
static void __cdecl set_depth_stencil_surface(e_surface surface);
static void __cdecl set_render_target(long render_target_index, e_surface surface, long render_state);
+ static void __cdecl set_using_albedo_sampler(bool using_albedo_sampler);
static void __cdecl set_viewport(short_rectangle2d const& viewport, real min_z, real max_z);
static void __cdecl wait_for_gpu_idle();
diff --git a/game/source/rasterizer/rasterizer_occlusion_queries.cpp b/game/source/rasterizer/rasterizer_occlusion_queries.cpp
new file mode 100644
index 000000000..090e78d3b
--- /dev/null
+++ b/game/source/rasterizer/rasterizer_occlusion_queries.cpp
@@ -0,0 +1,9 @@
+#include "rasterizer/rasterizer_occlusion_queries.hpp"
+
+#include "cseries/cseries.hpp"
+
+void __cdecl rasterizer_occlusions_retrieve(long a1)
+{
+ INVOKE(0x00A756D0, rasterizer_occlusions_retrieve, a1);
+}
+
diff --git a/game/source/rasterizer/rasterizer_occlusion_queries.hpp b/game/source/rasterizer/rasterizer_occlusion_queries.hpp
new file mode 100644
index 000000000..bb75fcd31
--- /dev/null
+++ b/game/source/rasterizer/rasterizer_occlusion_queries.hpp
@@ -0,0 +1,4 @@
+#pragma once
+
+extern void __cdecl rasterizer_occlusions_retrieve(long a1);
+
diff --git a/game/source/render/camera_fx_settings.hpp b/game/source/render/camera_fx_settings.hpp
index c4083a0e3..37af4ea93 100644
--- a/game/source/render/camera_fx_settings.hpp
+++ b/game/source/render/camera_fx_settings.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "cseries/cseries.hpp"
+#include "tag_files/tag_groups.hpp"
struct s_scripted_exposure
{
@@ -14,9 +15,58 @@ struct s_scripted_exposure
};
static_assert(sizeof(s_scripted_exposure) == 0x34);
+struct s_ssao_parameter
+{
+ // SSAO
+ // SSAO parameters
+
+ dword_flags flags;
+
+ real intensity;
+ real radius;
+ real sample_z_threshold;
+};
+static_assert(sizeof(s_ssao_parameter) == 0x10);
+
+struct s_color_grading_parameter
+{
+ // COLOR GRADING
+ // Color grading parameters
+
+ dword_flags flags;
+
+ real blend_time;
+
+ s_tag_block curves_editor;
+ s_tag_block brightness_contrast;
+ s_tag_block hue_saturation_lightness_vibrance;
+ s_tag_block colorize_effect;
+ s_tag_block selective_color;
+ s_tag_block color_balance;
+};
+static_assert(sizeof(s_color_grading_parameter) == 0x50);
+
+struct s_lightshafts
+{
+ // LIGHTSHAFTS
+ // Lightshafts parameters
+
+ dword_flags flags;
+
+ real pitch; // [0...90]
+ real heading; // [0...360]
+ real_rgb_color tint;
+ real depth_clamp;
+ real intensity_clamp; // [0...1]
+ real falloff_radius; // [0...2]
+ real intensity; // [0...50]
+ real blur_radius; // [0...20]
+};
+static_assert(sizeof(s_lightshafts) == 0x2C);
+
struct c_camera_fx_settings
{
- byte __data[0x170];
+ byte __data[0x164];
//struct exposure;
//struct auto_exposure_sensitivity;
@@ -33,16 +83,15 @@ struct c_camera_fx_settings
//struct bling_count;
//struct self_illum_preferred;
//struct self_illum_scale;
- //struct ssao;
- //struct color_grading;
- //struct lightshafts;
+ s_ssao_parameter ssao;
+ s_color_grading_parameter color_grading;
+ s_lightshafts lightshafts;
};
-static_assert(sizeof(c_camera_fx_settings) == 0x170);
+static_assert(sizeof(c_camera_fx_settings) == 0x1F0);
struct c_camera_fx_values
{
- c_camera_fx_settings m_settings;
- byte __data[0x80];
+ byte __data[0x1F0];
};
static_assert(sizeof(c_camera_fx_values) == 0x1F0);
diff --git a/game/source/render/render_game_state.hpp b/game/source/render/render_game_state.hpp
index 9ac8d4c7c..e19611a71 100644
--- a/game/source/render/render_game_state.hpp
+++ b/game/source/render/render_game_state.hpp
@@ -1,6 +1,6 @@
#pragma once
-#include "render/camera_fx_settings.hpp"
+#include "cseries/cseries.hpp"
struct s_render_game_state
{
@@ -12,8 +12,7 @@ struct s_render_game_state
struct s_player_window
{
- c_camera_fx_settings camera_fx_settings;
- c_camera_fx_values camera_fx_values;
+ byte __data[0x360];
};
static_assert(sizeof(s_player_window) == 0x360);
diff --git a/game/source/render/render_lens_flares.cpp b/game/source/render/render_lens_flares.cpp
index 8ea2809c9..16cf1cabf 100644
--- a/game/source/render/render_lens_flares.cpp
+++ b/game/source/render/render_lens_flares.cpp
@@ -2,8 +2,17 @@
#include "cseries/cseries.hpp"
+//.text:00A5A840 ; void __cdecl lens_flares_garbage_collect()
+
void __cdecl lens_flares_initialize()
{
INVOKE(0x00A5A8E0, lens_flares_initialize);
}
+//.text:00A5A920 ;
+
+void __cdecl lens_flares_render(long a1)
+{
+ INVOKE(0x00A5A960, lens_flares_render, a1);
+}
+
diff --git a/game/source/render/render_lens_flares.hpp b/game/source/render/render_lens_flares.hpp
index 2fb4a1775..b91236fc6 100644
--- a/game/source/render/render_lens_flares.hpp
+++ b/game/source/render/render_lens_flares.hpp
@@ -1,4 +1,5 @@
#pragma once
extern void __cdecl lens_flares_initialize();
+extern void __cdecl lens_flares_render(long a1);
diff --git a/game/source/render/render_lights.cpp b/game/source/render/render_lights.cpp
index e922dfe28..bb4c6769f 100644
--- a/game/source/render/render_lights.cpp
+++ b/game/source/render/render_lights.cpp
@@ -1,4 +1,11 @@
#include "render/render_lights.hpp"
+#include "render/views/render_view.hpp"
+
REFERENCE_DECLARE(0x05115B3C, bool, render_default_lighting);
+void c_lights_view::submit_simple_light_draw_list_to_shader() const
+{
+ INVOKE_CLASS_MEMBER(0x00A3BF70, c_lights_view, submit_simple_light_draw_list_to_shader);
+}
+
diff --git a/game/source/render/render_transparents.cpp b/game/source/render/render_transparents.cpp
index 7245ab90c..36acba8fe 100644
--- a/game/source/render/render_transparents.cpp
+++ b/game/source/render/render_transparents.cpp
@@ -4,3 +4,26 @@
REFERENCE_DECLARE(0x05216204, short, render_debug_transparent_sort_method);
+//.text:00A73580 ; public: static void __cdecl c_transparency_renderer::pop_marker()
+//.text:00A735D0 ; public: static void __cdecl c_transparency_renderer::push_marker()
+//.text:00A73620 ;
+
+void __cdecl c_transparency_renderer::render(bool a1)
+{
+ INVOKE(0x00A73640, c_transparency_renderer::render, a1);
+}
+
+//.text:00A736E0 ; public: static void __cdecl c_transparency_renderer::reset()
+
+void __cdecl c_transparency_renderer::set_active_camo_bounds(short_rectangle2d const* rect_a, short_rectangle2d const* rect_b)
+{
+ INVOKE(0x00A73710, c_transparency_renderer::set_active_camo_bounds, rect_a, rect_b);
+}
+
+//.text:00A73770 ; public: static void __cdecl c_transparency_renderer::resolve_framebuffer_for_active_camo()
+
+void __cdecl c_transparency_renderer::sort()
+{
+ INVOKE(0x00A73880, c_transparency_renderer::sort);
+}
+
diff --git a/game/source/render/render_transparents.hpp b/game/source/render/render_transparents.hpp
index e93566e80..0e0906ae0 100644
--- a/game/source/render/render_transparents.hpp
+++ b/game/source/render/render_transparents.hpp
@@ -1,4 +1,13 @@
#pragma once
+#include "cseries/cseries.hpp"
+
+struct c_transparency_renderer
+{
+ static void __cdecl render(bool a1);
+ static void __cdecl set_active_camo_bounds(short_rectangle2d const* rect_a, short_rectangle2d const* rect_b);
+ static void __cdecl sort();
+};
+
extern short& render_debug_transparent_sort_method;
diff --git a/game/source/render/screen_postprocess.cpp b/game/source/render/screen_postprocess.cpp
index 533fe3080..f8b4ea7b8 100644
--- a/game/source/render/screen_postprocess.cpp
+++ b/game/source/render/screen_postprocess.cpp
@@ -12,19 +12,25 @@ REFERENCE_DECLARE(0x01917D50, long, g_ssao_enable);
decltype(c_screen_postprocess::postprocess_player_view)* screen_postprocess_postprocess_player_view = c_screen_postprocess::postprocess_player_view;
HOOK_DECLARE_CALL(0x00A39F4E, screen_postprocess_postprocess_player_view);
HOOK_DECLARE_CALL(0x00A3A171, sub_A62D70);
+HOOK_DECLARE_CALL(0x00A61BBD, sub_A62720);
HOOK_DECLARE_CLASS(0x00A60460, c_screen_postprocess, copy);
HOOK_DECLARE_CLASS(0x00A601E0, c_screen_postprocess, blit);
HOOK_DECLARE_CLASS(0x00A60D60, c_screen_postprocess, gaussian_blur);
-void __cdecl sub_A62D70(c_camera_fx_values* fx_values, render_projection* projection, render_camera* camera)
+void __cdecl sub_A62720(s_lightshafts* lightshafts, render_projection* projection, render_camera* camera, c_rasterizer::e_surface surface_a, c_rasterizer::e_surface surface_b)
+{
+ c_d3d_pix_event _lightshafts(g_rasterizer_profile_pix_colors[1], L"lightshafts");
+
+ INVOKE(0x00A62720, sub_A62720, lightshafts, projection, camera, surface_a, surface_b);
+}
+
+void __cdecl sub_A62D70(c_camera_fx_settings* fx_settings, render_projection* projection, render_camera* camera)
{
if (players_get_active_and_in_game_count(true) > 1)
return;
- REFERENCE_DECLARE(offset_pointer(fx_values->m_settings.__data, 0x164), dword_flags, ssao_flags);
-
- bool ssao_enable = TEST_BIT(ssao_flags, 1);
+ bool ssao_enable = TEST_BIT(fx_settings->ssao.flags, 1);
if (g_ssao_enable != NONE)
ssao_enable = g_ssao_enable == 1;
@@ -32,7 +38,7 @@ void __cdecl sub_A62D70(c_camera_fx_values* fx_values, render_projection* projec
{
c_d3d_pix_event _ssao(g_rasterizer_profile_pix_colors[1], L"ssao");
- INVOKE(0x00A62D70, sub_A62D70, fx_values, projection, camera);
+ INVOKE(0x00A62D70, sub_A62D70, fx_settings, projection, camera);
}
}
diff --git a/game/source/render/screen_postprocess.hpp b/game/source/render/screen_postprocess.hpp
index 60d81ace6..311691c1e 100644
--- a/game/source/render/screen_postprocess.hpp
+++ b/game/source/render/screen_postprocess.hpp
@@ -6,6 +6,7 @@ enum e_splitscreen_res;
enum e_output_user_index;
struct c_camera_fx_values;
+struct c_camera_fx_settings;
struct render_projection;
struct render_camera;
struct s_screen_effect_settings;
@@ -54,7 +55,20 @@ struct c_screen_postprocess
c_rasterizer::e_surface surface);
static void __cdecl setup_rasterizer_for_postprocess(bool a1);
+
+ struct s_settings
+ {
+ bool __unknown0;
+ byte __data1[0x37];
+ };
+ static_assert(sizeof(s_settings) == 0x38);
+
+ static c_screen_postprocess::s_settings const* const& x_settings;
+
};
-extern void __cdecl sub_A62D70(c_camera_fx_values* fx_values, render_projection* projection, render_camera* camera);
+struct s_lightshafts;
+
+extern void __cdecl sub_A62720(s_lightshafts* lightshafts, render_projection* projection, render_camera* camera, c_rasterizer::e_surface surface_a, c_rasterizer::e_surface surface_b);
+extern void __cdecl sub_A62D70(c_camera_fx_settings* fx_settings, render_projection* projection, render_camera* camera);
diff --git a/game/source/render/views/render_player_view.cpp b/game/source/render/views/render_player_view.cpp
index e2a0cc79f..9cc690972 100644
--- a/game/source/render/views/render_player_view.cpp
+++ b/game/source/render/views/render_player_view.cpp
@@ -2,15 +2,20 @@
#include "memory/module.hpp"
#include "memory/thread_local.hpp"
+#include "rasterizer/rasterizer_occlusion_queries.hpp"
#include "rasterizer/rasterizer_profile.hpp"
#include "render/render_flags.hpp"
+#include "render/render_lens_flares.hpp"
+#include "render/render_transparents.hpp"
#include "render/screen_postprocess.hpp"
#include "render/views/render_view.hpp"
+#include "render_methods/render_method_submit.hpp"
REFERENCE_DECLARE(0x019147BC, real, render_debug_depth_render_scale_r);
REFERENCE_DECLARE(0x019147C0, real, render_debug_depth_render_scale_g);
REFERENCE_DECLARE(0x019147C4, real, render_debug_depth_render_scale_b);
REFERENCE_DECLARE(0x050FB3FC, long, render_debug_depth_render);
+REFERENCE_DECLARE(0x01694EC8, c_screen_postprocess::s_settings const* const, c_screen_postprocess::x_settings);
HOOK_DECLARE_CLASS_MEMBER(0x00A38040, c_player_view, render_distortions);
HOOK_DECLARE_CLASS_MEMBER(0x00A39860, c_player_view, queue_patchy_fog);
@@ -20,8 +25,10 @@ HOOK_DECLARE_CLASS(0x00A3A310, c_player_view, render_albedo_decals);
HOOK_DECLARE_CLASS_MEMBER(0x00A3A3F0, c_player_view, render_effects);
HOOK_DECLARE_CLASS_MEMBER(0x00A3A420, c_player_view, render_first_person);
HOOK_DECLARE_CLASS_MEMBER(0x00A3A5F0, c_player_view, render_first_person_albedo);
+HOOK_DECLARE_CLASS_MEMBER(0x00A3A6C0, c_player_view, render_lens_flares);
HOOK_DECLARE_CLASS_MEMBER(0x00A3A700, c_player_view, render_lightmap_shadows);
HOOK_DECLARE_CLASS_MEMBER(0x00A3A8C0, c_player_view, render_static_lighting);
+HOOK_DECLARE_CLASS_MEMBER(0x00A3B380, c_player_view, render_transparents);
HOOK_DECLARE_CLASS_MEMBER(0x00A3B470, c_player_view, render_water);
HOOK_DECLARE_CLASS_MEMBER(0x00A3B500, c_player_view, render_weather_occlusion);
HOOK_DECLARE_CLASS_MEMBER(0x00A3BDF0, c_player_view, distortion_generate);
@@ -121,7 +128,21 @@ void __thiscall c_player_view::render_first_person_albedo()
}
//.text:00A3A6B0 ;
-//.text:00A3A6C0 ; protected: void __cdecl c_player_view::render_lens_flares()
+
+void __thiscall c_player_view::render_lens_flares()
+{
+ //INVOKE_CLASS_MEMBER(0x00A3A6C0, c_player_view::render_lens_flares);
+
+ c_rasterizer::set_using_albedo_sampler(false);
+ rasterizer_occlusions_retrieve(m_player_index);
+
+ {
+ c_d3d_pix_event _lens_flares(g_rasterizer_profile_pix_colors[1], L"lens flares");
+ lens_flares_render(m_player_view_user_index);
+ }
+
+ c_rasterizer::set_using_albedo_sampler(c_rasterizer::surface_valid(c_rasterizer::_surface_albedo));
+}
void __thiscall c_player_view::render_lightmap_shadows()
{
@@ -132,7 +153,13 @@ void __thiscall c_player_view::render_lightmap_shadows()
HOOK_INVOKE_CLASS_MEMBER(, c_player_view, render_lightmap_shadows);
}
-//.text:00A3A790 ; protected: void __cdecl c_player_view::render_misc_transparents()
+void __cdecl c_player_view::render_misc_transparents()
+{
+ c_d3d_pix_event _render_misc_transparents(g_rasterizer_profile_pix_colors[1], L"render_misc_transparents");
+
+ INVOKE(0x00A3A790, c_player_view::render_misc_transparents);
+}
+
//.text:00A3A7A0 ; public: void __cdecl c_player_view::render_patchy_fog()
//.text:00A3A7F0 ; render_patchy_fog_callback
//.text:00A3A850 ; public: virtual void __cdecl c_player_view::render_setup()
@@ -191,7 +218,53 @@ void __cdecl render_texture_camera_initialize_for_new_map()
//.text:00A3B280 ; void __cdecl render_texture_camera_set_resolution(long, long)
//.text:00A3B2E0 ; void __cdecl render_texture_camera_set_target(real, real, real)
//.text:00A3B330 ; void __cdecl render_texture_camera_target_object(long, long)
-//.text:00A3B380 ; protected: void __cdecl c_player_view::render_transparents()
+
+// #TODO: move this
+bool __cdecl screenshot_in_progress()
+{
+ return INVOKE(0x00610310, screenshot_in_progress);
+}
+
+void __thiscall c_player_view::render_transparents()
+{
+ //INVOKE_CLASS_MEMBER(0x00A3B380, c_player_view, render_transparents);
+
+ render_method_submit_extern_texture_static(_render_method_extern_texture_global_target_z, 0);
+ render_method_submit_extern_texture_static(_render_method_extern_scene_ldr_texture, 0);
+ render_method_submit_extern_texture_static(_render_method_extern_texture_global_target_texaccum, 1);
+ render_method_submit_extern_texture_static(_render_method_extern_texture_global_target_normal, 1);
+ m_lights_view.submit_simple_light_draw_list_to_shader();
+
+ {
+ c_d3d_pix_event _transparents(g_rasterizer_profile_pix_colors[1], L"transparents");
+
+ c_rasterizer::setup_targets_static_lighting_alpha_blend(c_screen_postprocess::x_settings->__unknown0 || screenshot_in_progress(), true);
+ c_transparency_renderer::set_active_camo_bounds(&m_rasterizer_camera.window_pixel_bounds, &m_rasterizer_camera.render_pixel_bounds);
+ c_rasterizer::set_using_albedo_sampler(false);
+
+ {
+ c_d3d_pix_event _transparents_sky(g_rasterizer_profile_pix_colors[1], L"transparents: sky");
+ c_object_renderer::submit_and_render_sky(2, m_player_index);
+ }
+
+ {
+ c_d3d_pix_event _transparents_misc(g_rasterizer_profile_pix_colors[1], L"transparents: misc");
+ render_misc_transparents();
+ }
+
+ c_player_view::render_effects(_effect_pass_transparents);
+
+ {
+ c_d3d_pix_event _transparents_other(g_rasterizer_profile_pix_colors[1], L"transparents: other");
+ c_transparency_renderer::sort();
+ c_transparency_renderer::render(true);
+ c_rasterizer::set_using_albedo_sampler(c_rasterizer::surface_valid(c_rasterizer::_surface_albedo));
+ }
+ }
+
+ render_method_clear_extern(_render_method_extern_texture_global_target_texaccum);
+ render_method_clear_extern(_render_method_extern_texture_global_target_normal);
+}
void __thiscall c_player_view::render_water()
{
diff --git a/game/source/render/views/render_view.hpp b/game/source/render/views/render_view.hpp
index 3e81384c6..d64fd856b 100644
--- a/game/source/render/views/render_view.hpp
+++ b/game/source/render/views/render_view.hpp
@@ -121,6 +121,8 @@ struct c_lights_view :
public c_world_view
{
public:
+ void submit_simple_light_draw_list_to_shader() const;
+
static long& g_gel_bitmap_index;
static real& g_render_light_intensity;
static dword& g_debug_clip_planes;
@@ -222,8 +224,11 @@ struct c_player_view :
void __thiscall render_effects(e_effect_pass pass);
void __thiscall render_first_person(bool a1);
void __thiscall render_first_person_albedo();
+ void __thiscall render_lens_flares();
void __thiscall render_lightmap_shadows();
+ static void __cdecl render_misc_transparents();
void __thiscall render_static_lighting();
+ void __thiscall render_transparents();
void __thiscall render_water();
void __thiscall render_weather_occlusion();
void setup_camera(long player_index, long window_count, long window_arrangement, e_output_user_index output_user_index, s_observer_result const* result, bool render_freeze);
diff --git a/game/source/render_methods/render_method_submit.cpp b/game/source/render_methods/render_method_submit.cpp
index 6aad2cdb0..381da3884 100644
--- a/game/source/render_methods/render_method_submit.cpp
+++ b/game/source/render_methods/render_method_submit.cpp
@@ -1,10 +1,20 @@
#include "render_methods/render_method_submit.hpp"
+void __cdecl render_method_clear_extern(e_render_method_extern render_method_extern)
+{
+ INVOKE(0x00A3CA30, render_method_clear_extern, render_method_extern);
+}
+
void __cdecl render_method_submit_invalidate_cache()
{
INVOKE(0x00A3D090, render_method_submit_invalidate_cache);
};
+void __cdecl render_method_submit_extern_texture_static(e_render_method_extern render_method_extern, bool a2)
+{
+ INVOKE(0x00A3D200, render_method_submit_extern_texture_static, render_method_extern, a2);
+}
+
void __cdecl render_state_cache_dispose()
{
INVOKE(0x00A3DAF0, render_state_cache_dispose);
@@ -35,7 +45,6 @@ void __cdecl render_state_cache_initialize_for_new_structure_bsp(dword new_struc
INVOKE(0x00A3DB40, render_state_cache_initialize_for_new_structure_bsp, new_structure_bsp_mask);
}
-
char const* k_render_method_extern_names[k_render_method_extern_count]
{
"none",
diff --git a/game/source/render_methods/render_method_submit.hpp b/game/source/render_methods/render_method_submit.hpp
index ca12004b7..4aede9e13 100644
--- a/game/source/render_methods/render_method_submit.hpp
+++ b/game/source/render_methods/render_method_submit.hpp
@@ -61,7 +61,9 @@ enum e_render_method_extern
extern char const* k_render_method_extern_names[k_render_method_extern_count];
+extern void __cdecl render_method_clear_extern(e_render_method_extern render_method_extern);
extern void __cdecl render_method_submit_invalidate_cache();
+extern void __cdecl render_method_submit_extern_texture_static(e_render_method_extern render_method_extern, bool a2);
extern void __cdecl render_state_cache_dispose();
extern void __cdecl render_state_cache_dispose_from_old_map();
extern void __cdecl render_state_cache_dispose_from_old_structure_bsp(dword old_structure_bsp_mask);