Skip to content

Commit dda2520

Browse files
authored
Merge branch 'main' into SonicGaugeCodeEx
2 parents c75f7ae + 33499ab commit dda2520

21 files changed

Lines changed: 548 additions & 36 deletions

File tree

MarathonRecomp/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ set(MARATHON_RECOMP_PATCHES_CXX_SOURCES
138138
"patches/aspect_ratio_patches.cpp"
139139
"patches/audio_patches.cpp"
140140
"patches/camera_patches.cpp"
141+
"patches/fps_patches.cpp"
141142
"patches/frontend_listener.cpp"
142143
"patches/misc_patches.cpp"
143144
"patches/player_patches.cpp"
@@ -421,9 +422,12 @@ target_include_directories(MarathonRecomp PRIVATE
421422
)
422423

423424
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
425+
find_package(PkgConfig REQUIRED)
424426
find_package(X11 REQUIRED)
425-
target_include_directories(MarathonRecomp PRIVATE ${X11_INCLUDE_DIR})
426-
target_link_libraries(MarathonRecomp PRIVATE ${X11_LIBRARIES})
427+
pkg_search_module(GLIB REQUIRED glib-2.0)
428+
pkg_search_module(GIO REQUIRED gio-2.0)
429+
target_include_directories(MarathonRecomp PRIVATE ${X11_INCLUDE_DIR} ${GLIB_INCLUDE_DIRS} ${GIO_INCLUDE_DIRS})
430+
target_link_libraries(MarathonRecomp PRIVATE ${X11_LIBRARIES} ${GLIB_LIBRARIES} ${GIO_LIBRARIES})
427431
endif()
428432

429433
target_precompile_headers(MarathonRecomp PUBLIC ${MARATHON_RECOMP_PRECOMPILED_HEADERS})

MarathonRecomp/api/Marathon.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@
5959
#include "Sonicteam/SoX/Engine/Task.h"
6060
#include "Sonicteam/SoX/MessageReceiver.h"
6161
#include "Sonicteam/SoX/Object.h"
62+
#include "Sonicteam/SoX/Physics/Havok/WorldHavok.h"
63+
#include "Sonicteam/SoX/Physics/World.h"
64+
#include "Sonicteam/SoX/RefCountObject.h"
6265
#include "Sonicteam/System/CreateStatic.h"
6366
#include "Sonicteam/System/Singleton.h"
6467
#include "Sonicteam/TitleTask.h"

MarathonRecomp/api/Sonicteam/GameImp.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/Physics/World.h>
45

56
namespace Sonicteam
67
{
@@ -29,5 +30,13 @@ namespace Sonicteam
2930

3031
MARATHON_INSERT_PADDING(0xE3C);
3132
PlayerData m_PlayerData[4];
33+
MARATHON_INSERT_PADDING(0xA4C);
34+
xpointer<SoX::Physics::World> m_pPhysicsWorld;
35+
xpointer<void> m_pMyCollisionFilter;
36+
37+
template <typename T>
38+
inline T* GetPhysicsWorld();
3239
};
3340
}
41+
42+
#include <Sonicteam/GameImp.inl>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Sonicteam
2+
{
3+
template <typename T>
4+
inline T* GameImp::GetPhysicsWorld()
5+
{
6+
return (T*)m_pPhysicsWorld.get();
7+
}
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/Physics/World.h>
5+
6+
namespace Sonicteam::SoX::Physics::Havok
7+
{
8+
class WorldHavok : public World
9+
{
10+
public:
11+
MARATHON_INSERT_PADDING(0x18);
12+
bool m_IsDynamicUpdateRate;
13+
};
14+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#pragma once
2+
3+
#include <Marathon.inl>
4+
#include <Sonicteam/SoX/RefCountObject.h>
5+
6+
namespace Sonicteam::SoX::Physics
7+
{
8+
class World : public RefCountObject {};
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
namespace Sonicteam::SoX
4+
{
5+
class RefCountObject
6+
{
7+
public:
8+
xpointer<void> m_pVftable;
9+
be<uint32_t> m_ReferenceCount;
10+
};
11+
}

MarathonRecomp/app.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <kernel/function.h>
55
#include <os/process.h>
66
#include <os/logger.h>
7+
#include <patches/audio_patches.h>
78
#include <ui/game_window.h>
89
#include <user/config.h>
910
#include <user/paths.h>
@@ -19,13 +20,6 @@ void App::Restart(std::vector<std::string> restartArgs)
1920

2021
void App::Exit()
2122
{
22-
// TODO (Hyper): remove this once the new options menu is implemented.
23-
if (auto pAudioEngine = Sonicteam::AudioEngineXenon::GetInstance())
24-
{
25-
Config::MusicVolume = pAudioEngine->m_MusicVolume;
26-
Config::EffectsVolume = pAudioEngine->m_EffectsVolume;
27-
}
28-
2923
Config::Save();
3024

3125
#ifdef _WIN32
@@ -98,6 +92,8 @@ PPC_FUNC(sub_825EA610)
9892
// Allow variable FPS when config is not 60 FPS.
9993
App::s_pApp->m_pDoc->m_VFrame = Config::FPS != 60;
10094

95+
AudioPatches::Update(App::s_deltaTime);
96+
10197
__imp__sub_825EA610(ctx, base);
10298
}
10399

MarathonRecomp/gpu/video.cpp

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ struct PipelineState
165165
RenderBlend srcBlend = RenderBlend::ONE;
166166
RenderBlend destBlend = RenderBlend::ZERO;
167167
RenderCullMode cullMode = RenderCullMode::NONE;
168+
RenderFrontFace frontFace = RenderFrontFace::CLOCKWISE;
168169
RenderComparisonFunction zFunc = RenderComparisonFunction::LESS;
169170
RenderComparisonFunction stencilFunc = RenderComparisonFunction::ALWAYS;
170171
RenderStencilOp stencilFail = RenderStencilOp::KEEP;
@@ -724,17 +725,22 @@ static void DestructTempResources()
724725
{
725726
case ResourceType::Texture:
726727
case ResourceType::VolumeTexture:
728+
case ResourceType::ArrayTexture:
727729
{
728730
const auto texture = reinterpret_cast<GuestTexture*>(resource);
729731

730732
if (texture->mappedMemory != nullptr) {
731733
g_userHeap.Free(texture->mappedMemory);
732734
}
733735

736+
g_textureDescriptorSet->setTexture(texture->descriptorIndex, nullptr, {});
734737
g_textureDescriptorAllocator.free(texture->descriptorIndex);
735738

736739
if (texture->patchedTexture != nullptr)
740+
{
741+
g_textureDescriptorSet->setTexture(texture->patchedTexture->descriptorIndex, nullptr, {});
737742
g_textureDescriptorAllocator.free(texture->patchedTexture->descriptorIndex);
743+
}
738744

739745
texture->~GuestTexture();
740746
break;
@@ -759,7 +765,10 @@ static void DestructTempResources()
759765
const auto surface = reinterpret_cast<GuestSurface*>(resource);
760766

761767
if (surface->descriptorIndex != NULL)
768+
{
769+
g_textureDescriptorSet->setTexture(surface->descriptorIndex, nullptr, {});
762770
g_textureDescriptorAllocator.free(surface->descriptorIndex);
771+
}
763772

764773
surface->~GuestSurface();
765774
break;
@@ -1248,14 +1257,16 @@ static void ProcSetRenderState(const RenderCommand& cmd)
12481257
RenderCullMode cullMode;
12491258

12501259
switch (value) {
1251-
case D3DCULL_NONE:
1252-
case D3DCULL_NONE_2:
1260+
case D3DCULL_NONE_CCW:
1261+
case D3DCULL_NONE_CW:
12531262
cullMode = RenderCullMode::NONE;
12541263
break;
1255-
case D3DCULL_CW:
1264+
case D3DCULL_FRONT_CCW:
1265+
case D3DCULL_FRONT_CW:
12561266
cullMode = RenderCullMode::FRONT;
12571267
break;
1258-
case D3DCULL_CCW:
1268+
case D3DCULL_BACK_CCW:
1269+
case D3DCULL_BACK_CW:
12591270
cullMode = RenderCullMode::BACK;
12601271
break;
12611272
default:
@@ -1265,6 +1276,7 @@ static void ProcSetRenderState(const RenderCommand& cmd)
12651276
}
12661277

12671278
SetDirtyValue(g_dirtyStates.pipelineState, g_pipelineState.cullMode, cullMode);
1279+
SetDirtyValue(g_dirtyStates.pipelineState, g_pipelineState.frontFace, value < D3DCULL_NONE_CW ? RenderFrontFace::COUNTER_CLOCKWISE : RenderFrontFace::CLOCKWISE);
12681280
break;
12691281
}
12701282
case D3DRS_ZFUNC:
@@ -4410,6 +4422,7 @@ static std::unique_ptr<RenderPipeline> CreateGraphicsPipeline(const PipelineStat
44104422
desc.depthClipEnabled = true;
44114423
desc.primitiveTopology = pipelineState.primitiveTopology;
44124424
desc.cullMode = pipelineState.cullMode;
4425+
desc.frontFace = pipelineState.frontFace;
44134426
desc.renderTargetFormat[0] = pipelineState.renderTargetFormat;
44144427
desc.renderTargetBlend[0].blendEnabled = pipelineState.alphaBlendEnable;
44154428
desc.renderTargetBlend[0].srcBlend = pipelineState.srcBlend;
@@ -4501,10 +4514,24 @@ static RenderPipeline* CreateGraphicsPipelineInRenderThread(PipelineState pipeli
45014514
" instancing: {}\n"
45024515
" zEnable: {}\n"
45034516
" zWriteEnable: {}\n"
4517+
" stencilEnable: {}\n"
4518+
" stencilTwoSided: {}\n"
45044519
" srcBlend: {}\n"
45054520
" destBlend: {}\n"
45064521
" cullMode: {}\n"
4522+
" frontFace: {}\n"
45074523
" zFunc: {}\n"
4524+
" stencilFunc: {}\n"
4525+
" stencilFail: {}\n"
4526+
" stencilZFail: {}\n"
4527+
" stencilPass: {}\n"
4528+
" stencilFuncCCW: {}\n"
4529+
" stencilFailCCW: {}\n"
4530+
" stencilZFailCCW: {}\n"
4531+
" stencilPassCCW: {}\n"
4532+
" stencilMask: {}\n"
4533+
" stencilWriteMask: {}\n"
4534+
" stencilRef: {}\n"
45084535
" alphaBlendEnable: {}\n"
45094536
" blendOp: {}\n"
45104537
" slopeScaledDepthBias: {}\n"
@@ -4530,10 +4557,24 @@ static RenderPipeline* CreateGraphicsPipelineInRenderThread(PipelineState pipeli
45304557
pipelineState.instancing,
45314558
pipelineState.zEnable,
45324559
pipelineState.zWriteEnable,
4560+
pipelineState.stencilEnable,
4561+
pipelineState.stencilTwoSided,
45334562
magic_enum::enum_name(pipelineState.srcBlend),
45344563
magic_enum::enum_name(pipelineState.destBlend),
45354564
magic_enum::enum_name(pipelineState.cullMode),
4565+
magic_enum::enum_name(pipelineState.frontFace),
45364566
magic_enum::enum_name(pipelineState.zFunc),
4567+
magic_enum::enum_name(pipelineState.stencilFunc),
4568+
magic_enum::enum_name(pipelineState.stencilFail),
4569+
magic_enum::enum_name(pipelineState.stencilZFail),
4570+
magic_enum::enum_name(pipelineState.stencilPass),
4571+
magic_enum::enum_name(pipelineState.stencilFuncCCW),
4572+
magic_enum::enum_name(pipelineState.stencilFailCCW),
4573+
magic_enum::enum_name(pipelineState.stencilZFailCCW),
4574+
magic_enum::enum_name(pipelineState.stencilPassCCW),
4575+
pipelineState.stencilMask,
4576+
pipelineState.stencilWriteMask,
4577+
pipelineState.stencilRef,
45374578
pipelineState.alphaBlendEnable,
45384579
magic_enum::enum_name(pipelineState.blendOp),
45394580
pipelineState.slopeScaledDepthBias,
@@ -7802,7 +7843,6 @@ class SDLEventListenerForPSOCaching : public SDLEventListener
78027843
pipelineState.sampleCount = 1;
78037844
pipelineState.enableAlphaToCoverage = false;
78047845

7805-
pipelineState.specConstants &= ~SPEC_CONSTANT_BICUBIC_GI_FILTER;
78067846
if ((pipelineState.specConstants & SPEC_CONSTANT_ALPHA_TO_COVERAGE) != 0)
78077847
{
78087848
pipelineState.specConstants &= ~SPEC_CONSTANT_ALPHA_TO_COVERAGE;
@@ -7832,10 +7872,24 @@ class SDLEventListenerForPSOCaching : public SDLEventListener
78327872
"{},"
78337873
"{},"
78347874
"{},"
7875+
"{},"
7876+
"{},"
78357877
"RenderBlend::{},"
78367878
"RenderBlend::{},"
78377879
"RenderCullMode::{},"
7880+
"RenderFrontFace::{},"
78387881
"RenderComparisonFunction::{},"
7882+
"RenderComparisonFunction::{},"
7883+
"RenderStencilOp::{},"
7884+
"RenderStencilOp::{},"
7885+
"RenderStencilOp::{},"
7886+
"RenderComparisonFunction::{},"
7887+
"RenderStencilOp::{},"
7888+
"RenderStencilOp::{},"
7889+
"RenderStencilOp::{},"
7890+
"{},"
7891+
"{},"
7892+
"{},"
78397893
"{},"
78407894
"RenderBlendOperation::{},"
78417895
"{},"
@@ -7857,10 +7911,24 @@ class SDLEventListenerForPSOCaching : public SDLEventListener
78577911
pipelineState.instancing,
78587912
pipelineState.zEnable,
78597913
pipelineState.zWriteEnable,
7914+
pipelineState.stencilEnable,
7915+
pipelineState.stencilTwoSided,
78607916
magic_enum::enum_name(pipelineState.srcBlend),
78617917
magic_enum::enum_name(pipelineState.destBlend),
78627918
magic_enum::enum_name(pipelineState.cullMode),
7919+
magic_enum::enum_name(pipelineState.frontFace),
78637920
magic_enum::enum_name(pipelineState.zFunc),
7921+
magic_enum::enum_name(pipelineState.stencilFunc),
7922+
magic_enum::enum_name(pipelineState.stencilFail),
7923+
magic_enum::enum_name(pipelineState.stencilZFail),
7924+
magic_enum::enum_name(pipelineState.stencilPass),
7925+
magic_enum::enum_name(pipelineState.stencilFuncCCW),
7926+
magic_enum::enum_name(pipelineState.stencilFailCCW),
7927+
magic_enum::enum_name(pipelineState.stencilZFailCCW),
7928+
magic_enum::enum_name(pipelineState.stencilPassCCW),
7929+
pipelineState.stencilMask,
7930+
pipelineState.stencilWriteMask,
7931+
pipelineState.stencilRef,
78647932
pipelineState.alphaBlendEnable,
78657933
magic_enum::enum_name(pipelineState.blendOp),
78667934
pipelineState.slopeScaledDepthBias,

MarathonRecomp/gpu/video.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,10 +386,12 @@ enum GuestRenderState
386386

387387
enum GuestCullMode
388388
{
389-
D3DCULL_NONE = 0,
390-
D3DCULL_CW = 2,
391-
D3DCULL_NONE_2 = 4,
392-
D3DCULL_CCW = 6
389+
D3DCULL_NONE_CCW = 0,
390+
D3DCULL_FRONT_CCW = 1,
391+
D3DCULL_BACK_CCW = 2,
392+
D3DCULL_NONE_CW = 4,
393+
D3DCULL_FRONT_CW = 5,
394+
D3DCULL_BACK_CW = 6
393395
};
394396

395397
enum GuestBlendMode

0 commit comments

Comments
 (0)