diff --git a/game/game.vcxproj b/game/game.vcxproj
index 48d008b64..ede217209 100644
--- a/game/game.vcxproj
+++ b/game/game.vcxproj
@@ -231,6 +231,10 @@ copy /b $(ProjectDir)source\config\version.cpp +,, $(ProjectDir)source\config\ve
+
+
+
+
@@ -301,11 +305,13 @@ copy /b $(ProjectDir)source\config\version.cpp +,, $(ProjectDir)source\config\ve
+
+
@@ -1121,8 +1127,10 @@ copy /b $(ProjectDir)source\config\version.cpp +,, $(ProjectDir)source\config\ve
+
+
diff --git a/game/game.vcxproj.filters b/game/game.vcxproj.filters
index 056928991..c8a857c31 100644
--- a/game/game.vcxproj.filters
+++ b/game/game.vcxproj.filters
@@ -1638,6 +1638,24 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
@@ -3824,6 +3842,12 @@
Header Files
+
+ Header Files
+
+
+ Header Files
+
diff --git a/game/source/gpu_particle/beam_gpu.cpp b/game/source/gpu_particle/beam_gpu.cpp
new file mode 100644
index 000000000..dee060904
--- /dev/null
+++ b/game/source/gpu_particle/beam_gpu.cpp
@@ -0,0 +1,7 @@
+#include "gpu_particle/beam_gpu.hpp"
+
+void __cdecl c_beam_gpu::shell_initialize()
+{
+ INVOKE(0x00A51B90, c_beam_gpu::shell_initialize);
+}
+
diff --git a/game/source/gpu_particle/beam_gpu.hpp b/game/source/gpu_particle/beam_gpu.hpp
index 727ec722b..e52f1d07a 100644
--- a/game/source/gpu_particle/beam_gpu.hpp
+++ b/game/source/gpu_particle/beam_gpu.hpp
@@ -6,6 +6,9 @@
struct c_beam_gpu :
s_datum_header
{
+public:
+ static void __cdecl shell_initialize();
+
struct s_row :
s_datum_header
{
diff --git a/game/source/gpu_particle/contrail_gpu.cpp b/game/source/gpu_particle/contrail_gpu.cpp
new file mode 100644
index 000000000..0443a6c5c
--- /dev/null
+++ b/game/source/gpu_particle/contrail_gpu.cpp
@@ -0,0 +1,7 @@
+#include "gpu_particle/contrail_gpu.hpp"
+
+void __cdecl c_contrail_gpu::shell_initialize()
+{
+ INVOKE(0x00A58460, c_contrail_gpu::shell_initialize);
+}
+
diff --git a/game/source/gpu_particle/contrail_gpu.hpp b/game/source/gpu_particle/contrail_gpu.hpp
index 530ea166a..8d22a3021 100644
--- a/game/source/gpu_particle/contrail_gpu.hpp
+++ b/game/source/gpu_particle/contrail_gpu.hpp
@@ -6,6 +6,9 @@
struct c_contrail_gpu :
s_datum_header
{
+public:
+ static void __cdecl shell_initialize();
+
struct s_row :
s_datum_header
{
diff --git a/game/source/gpu_particle/light_volume_gpu.cpp b/game/source/gpu_particle/light_volume_gpu.cpp
new file mode 100644
index 000000000..223147a2c
--- /dev/null
+++ b/game/source/gpu_particle/light_volume_gpu.cpp
@@ -0,0 +1,7 @@
+#include "gpu_particle/light_volume_gpu.hpp"
+
+void __cdecl c_light_volume_gpu::shell_initialize()
+{
+ INVOKE(0x00A5D6B0, c_light_volume_gpu::shell_initialize);
+}
+
diff --git a/game/source/gpu_particle/light_volume_gpu.hpp b/game/source/gpu_particle/light_volume_gpu.hpp
index 421d949d2..5dd2533ba 100644
--- a/game/source/gpu_particle/light_volume_gpu.hpp
+++ b/game/source/gpu_particle/light_volume_gpu.hpp
@@ -6,6 +6,9 @@
struct c_light_volume_gpu :
s_datum_header
{
+public:
+ static void __cdecl shell_initialize();
+
struct s_row :
s_datum_header
{
diff --git a/game/source/gpu_particle/particle_block.cpp b/game/source/gpu_particle/particle_block.cpp
new file mode 100644
index 000000000..affa0d4a0
--- /dev/null
+++ b/game/source/gpu_particle/particle_block.cpp
@@ -0,0 +1,7 @@
+#include "gpu_particle/particle_block.hpp"
+
+void __cdecl c_particle_emitter_gpu::shell_initialize()
+{
+ INVOKE(0x00A4E9F0, c_particle_emitter_gpu::shell_initialize);
+}
+
diff --git a/game/source/gpu_particle/particle_block.hpp b/game/source/gpu_particle/particle_block.hpp
index ae33eef7b..6505d25a4 100644
--- a/game/source/gpu_particle/particle_block.hpp
+++ b/game/source/gpu_particle/particle_block.hpp
@@ -6,6 +6,9 @@
struct c_particle_emitter_gpu :
s_datum_header
{
+public:
+ static void __cdecl shell_initialize();
+
struct s_row :
s_datum_header
{
diff --git a/game/source/rasterizer/rasterizer.cpp b/game/source/rasterizer/rasterizer.cpp
index 2a2d2a337..ac93d3032 100644
--- a/game/source/rasterizer/rasterizer.cpp
+++ b/game/source/rasterizer/rasterizer.cpp
@@ -2,13 +2,19 @@
#include "cseries/cseries.hpp"
#include "cseries/cseries_events.hpp"
+#include "gpu_particle/beam_gpu.hpp"
+#include "gpu_particle/contrail_gpu.hpp"
+#include "gpu_particle/light_volume_gpu.hpp"
+#include "gpu_particle/particle_block.hpp"
#include "main/global_preferences.hpp"
#include "main/main.hpp"
#include "memory/module.hpp"
#include "memory/thread_local.hpp"
+#include "rasterizer/rasterizer_dynamic_render_targets.hpp"
#include "rasterizer/rasterizer_main.hpp"
#include "rasterizer/rasterizer_memory.hpp"
#include "rasterizer/rasterizer_resource_definitions.hpp"
+#include "render/render_lens_flares.hpp"
#include "render/screen_postprocess.hpp"
#include "render_methods/render_method_submit.hpp"
#include "shell/shell.hpp"
@@ -301,44 +307,44 @@ void __cdecl c_rasterizer::shell_dispose()
void __cdecl c_rasterizer::shell_initialize(bool window_exists, bool windowed)
{
- INVOKE(0x00A20370, shell_initialize, window_exists, windowed);
+ //INVOKE(0x00A20370, shell_initialize, window_exists, windowed);
- //if (!c_rasterizer::initialized)
- //{
- // if (c_rasterizer::initialize_device(window_exists, windowed))
- // {
- // if (c_rasterizer::g_device)
- // {
- // c_particle_emitter_gpu::shell_initialize();
- // c_contrail_gpu::shell_initialize();
- // c_light_volume_gpu::shell_initialize();
- // c_beam_gpu::shell_initialize();
- // c_rasterizer_texture_ref::initialize();
- // c_dynamic_render_targets::shell_initialize();
- // c_rasterizer::initialize_after_device_creation_or_reset();
- // rasterizer_memory_initialize();
- // }
- //
- // c_rasterizer::initialized = true;
- // }
- //}
- //else if (!c_rasterizer::initialized)
- //{
- // return;
- //}
- //
- //TLS_DATA_GET_VALUE_REFERENCE(g_rasterizer_game_states);
- //TLS_DATA_GET_VALUE_REFERENCE(g_hue_saturation_control_in_gamestate);
- //
- //g_rasterizer_game_states = (s_rasterizer_game_states*)g_rasterizer_game_states_allocator.allocate(sizeof(s_rasterizer_game_states), "rasterizer game states");
- //g_rasterizer_game_states->motion_blur = true;
- //g_rasterizer_game_states->atmosphere_fog = true;
- //g_rasterizer_game_states->patchy_fog = true;
- //g_rasterizer_game_states->weather = true;
- //g_rasterizer_game_states->cinematic_motion_blur = false;
- //
- //g_hue_saturation_control_in_gamestate = (c_hue_saturation_control*)g_hue_saturation_control_allocator.allocate(sizeof(c_hue_saturation_control), "hue saturation control");
- //*g_hue_saturation_control_in_gamestate = g_hue_saturation_control_default;
+ if (!c_rasterizer::initialized)
+ {
+ if (c_rasterizer::initialize_device(window_exists, windowed))
+ {
+ if (c_rasterizer::g_device)
+ {
+ c_particle_emitter_gpu::shell_initialize();
+ c_contrail_gpu::shell_initialize();
+ c_light_volume_gpu::shell_initialize();
+ c_beam_gpu::shell_initialize();
+ c_rasterizer_texture_ref::initialize();
+ c_dynamic_render_targets::shell_initialize();
+ c_rasterizer::initialize_after_device_creation_or_reset();
+ rasterizer_memory_initialize();
+ lens_flares_initialize();
+ }
+
+ c_rasterizer::initialized = true;
+ }
+
+ if (c_rasterizer::initialized)
+ {
+ TLS_DATA_GET_VALUE_REFERENCE(g_rasterizer_game_states);
+ TLS_DATA_GET_VALUE_REFERENCE(g_hue_saturation_control_in_gamestate);
+
+ g_rasterizer_game_states = (s_rasterizer_game_states*)g_rasterizer_game_states_allocator.allocate(sizeof(s_rasterizer_game_states), "rasterizer game states");
+ g_rasterizer_game_states->motion_blur = true;
+ g_rasterizer_game_states->atmosphere_fog = true;
+ g_rasterizer_game_states->patchy_fog = true;
+ g_rasterizer_game_states->weather = true;
+ g_rasterizer_game_states->cinematic_motion_blur = false;
+
+ g_hue_saturation_control_in_gamestate = (c_hue_saturation_control*)g_hue_saturation_control_allocator.allocate(sizeof(c_hue_saturation_control), "hue saturation control");
+ *g_hue_saturation_control_in_gamestate = g_hue_saturation_control_default;
+ }
+ }
}
void __cdecl c_rasterizer::set_render_resolution(long width, long height, bool fullscreen)
diff --git a/game/source/rasterizer/rasterizer_dynamic_render_targets.cpp b/game/source/rasterizer/rasterizer_dynamic_render_targets.cpp
new file mode 100644
index 000000000..bc25edea9
--- /dev/null
+++ b/game/source/rasterizer/rasterizer_dynamic_render_targets.cpp
@@ -0,0 +1,9 @@
+#include "rasterizer/rasterizer_dynamic_render_targets.hpp"
+
+#include "cseries/cseries.hpp"
+
+void __cdecl c_dynamic_render_targets::shell_initialize()
+{
+ INVOKE(0x00A750E0, c_dynamic_render_targets::shell_initialize);
+}
+
diff --git a/game/source/rasterizer/rasterizer_dynamic_render_targets.hpp b/game/source/rasterizer/rasterizer_dynamic_render_targets.hpp
new file mode 100644
index 000000000..2fdac8ea1
--- /dev/null
+++ b/game/source/rasterizer/rasterizer_dynamic_render_targets.hpp
@@ -0,0 +1,8 @@
+#pragma once
+
+struct c_dynamic_render_targets
+{
+public:
+ static void __cdecl shell_initialize();
+};
+
diff --git a/game/source/rasterizer/rasterizer_text.cpp b/game/source/rasterizer/rasterizer_text.cpp
index 580657fb3..0b40a130c 100644
--- a/game/source/rasterizer/rasterizer_text.cpp
+++ b/game/source/rasterizer/rasterizer_text.cpp
@@ -10,6 +10,11 @@ IDirect3DTexture9* __cdecl c_rasterizer_texture_ref::get_d3d_texture() const
return DECLFUNC(0x00A6E8E0, IDirect3DTexture9*, __thiscall, c_rasterizer_texture_ref const*)(this);
}
+void __cdecl c_rasterizer_texture_ref::initialize()
+{
+ INVOKE(0x00A6E9C0, c_rasterizer_texture_ref::initialize);
+}
+
void __cdecl c_rasterizer_texture_ref::release(c_rasterizer_texture_ref& texture_ref)
{
INVOKE(0x00A6EB10, c_rasterizer_texture_ref::release, texture_ref);
diff --git a/game/source/rasterizer/rasterizer_text.hpp b/game/source/rasterizer/rasterizer_text.hpp
index 02ef5168b..d8de1b89b 100644
--- a/game/source/rasterizer/rasterizer_text.hpp
+++ b/game/source/rasterizer/rasterizer_text.hpp
@@ -8,6 +8,7 @@ struct c_rasterizer_texture_ref
public:
static void __cdecl allocate(c_rasterizer_texture_ref& texture_ref, long width, long height, long levels, dword format, long a6, bool a7, long a8, long a9);
IDirect3DTexture9* __cdecl get_d3d_texture() const;
+ static void __cdecl initialize();
static void __cdecl release(c_rasterizer_texture_ref& texture_ref);
bool __cdecl valid();
diff --git a/game/source/render/render_lens_flares.cpp b/game/source/render/render_lens_flares.cpp
new file mode 100644
index 000000000..8ea2809c9
--- /dev/null
+++ b/game/source/render/render_lens_flares.cpp
@@ -0,0 +1,9 @@
+#include "render/render_lens_flares.hpp"
+
+#include "cseries/cseries.hpp"
+
+void __cdecl lens_flares_initialize()
+{
+ INVOKE(0x00A5A8E0, lens_flares_initialize);
+}
+
diff --git a/game/source/render/render_lens_flares.hpp b/game/source/render/render_lens_flares.hpp
new file mode 100644
index 000000000..2fb4a1775
--- /dev/null
+++ b/game/source/render/render_lens_flares.hpp
@@ -0,0 +1,4 @@
+#pragma once
+
+extern void __cdecl lens_flares_initialize();
+