Skip to content

Commit ef3aa37

Browse files
committed
Fix crash on escape and black background in DX11
1 parent 2d04b51 commit ef3aa37

6 files changed

Lines changed: 46 additions & 16 deletions

File tree

Engine/include/public/ECS/Components/FirstPersonController.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <ECS/Components/CameraController.hpp>
55
#include <Core/OSDef.hpp>
66
#include <Events/KeyboardEvent.h>
7+
#include <string>
78

89
namespace Sleak {
910

@@ -14,6 +15,7 @@ namespace Sleak {
1415
class ENGINE_API FirstPersonController : public CameraController {
1516
public:
1617
FirstPersonController(GameObject* object);
18+
~FirstPersonController() override;
1719

1820
bool Initialize() override;
1921
void Update(float deltaTime) override;
@@ -68,6 +70,9 @@ namespace Sleak {
6870
bool m_firstFrame = true;
6971

7072
RigidbodyComponent* m_rigidbody = nullptr;
73+
74+
std::string m_keyPressedHandlerId;
75+
std::string m_keyReleasedHandlerId;
7176
};
7277

7378
} // namespace Sleak

Engine/include/public/ECS/Components/FreeLookCameraController.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
#include <ECS/Components/CameraController.hpp>
55
#include <Events/KeyboardEvent.h>
66
#include <Core/OSDef.hpp>
7+
#include <string>
78

89
namespace Sleak {
910
class ENGINE_API FreeLookCameraController : public CameraController {
1011
public:
1112
FreeLookCameraController(GameObject* object);
13+
~FreeLookCameraController() override;
1214

1315
bool Initialize() override;
1416
void Update(float deltaTime) override;
@@ -73,6 +75,9 @@ namespace Sleak {
7375
Math::Vector2D RollRange;
7476

7577
bool m_firstFrame = true;
78+
79+
std::string m_keyPressedHandlerId;
80+
std::string m_keyReleasedHandlerId;
7681
};
7782
}
7883

Engine/include/public/Events/Event.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,19 @@ namespace Sleak {
123123
template<typename EventT>
124124
static void DispatchEvent(const EventT& event) {
125125
EventType type = event.GetEventType();
126-
127-
if (eventHandlers.find(type) != eventHandlers.end()) {
128-
for (auto& handler : eventHandlers[type]) {
129-
// Try to cast to the right event delegate type
130-
auto typedDelegate = std::dynamic_pointer_cast<EventDelegate<EventT>>(handler);
131-
if (typedDelegate) {
132-
typedDelegate->SetEvent(event);
133-
typedDelegate->Execute();
134-
}
126+
127+
if (eventHandlers.find(type) == eventHandlers.end())
128+
return;
129+
130+
// Copy the handler list so that handlers which add/remove entries
131+
// during dispatch don't invalidate the iteration.
132+
auto handlers = eventHandlers[type];
133+
for (auto& handler : handlers) {
134+
// Try to cast to the right event delegate type
135+
auto typedDelegate = std::dynamic_pointer_cast<EventDelegate<EventT>>(handler);
136+
if (typedDelegate) {
137+
typedDelegate->SetEvent(event);
138+
typedDelegate->Execute();
135139
}
136140
}
137141
}

Engine/src/DirectX11Renderer.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,9 +432,16 @@ void DirectX11Renderer::DrawIndexedInstance(uint32_t instanceCount,
432432
void DirectX11Renderer::ClearRenderTarget(float r, float g, float b, float a) {
433433
const float clearColor[4] = {r, g, b, a};
434434

435-
ID3D11RenderTargetView* target = msaaSampleCount > 1 ? msaaRenderTargetView : renderTargetView;
436-
437-
deviceContext->ClearRenderTargetView(target, clearColor);
435+
ID3D11RenderTargetView* target;
436+
if (m_tonemapEnabled && m_tonemapResourcesCreated && msaaSampleCount <= 1)
437+
target = m_hdrRTV;
438+
else if (msaaSampleCount > 1)
439+
target = msaaRenderTargetView;
440+
else
441+
target = renderTargetView;
442+
443+
if (target)
444+
deviceContext->ClearRenderTargetView(target, clearColor);
438445
}
439446

440447
void DirectX11Renderer::ClearDepthStencil(bool clearDepth, bool clearStencil,

Engine/src/FirstPersonController.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@ FirstPersonController::FirstPersonController(GameObject* object)
1616
m_velocity = Math::Vector3D::Zero();
1717
translationInput = Math::Vector3D::Zero();
1818

19-
EventDispatcher::RegisterEventHandler(this, &FirstPersonController::OnKeyPressed);
20-
EventDispatcher::RegisterEventHandler(this, &FirstPersonController::OnKeyReleased);
19+
m_keyPressedHandlerId = EventDispatcher::RegisterEventHandler(this, &FirstPersonController::OnKeyPressed);
20+
m_keyReleasedHandlerId = EventDispatcher::RegisterEventHandler(this, &FirstPersonController::OnKeyReleased);
21+
}
22+
23+
FirstPersonController::~FirstPersonController() {
24+
EventDispatcher::UnregisterEvent(EventType::KeyPressed, m_keyPressedHandlerId);
25+
EventDispatcher::UnregisterEvent(EventType::KeyReleased, m_keyReleasedHandlerId);
2126
}
2227

2328
bool FirstPersonController::Initialize() {

Engine/src/FreeLookCameraControllerComponent.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,13 @@ namespace Sleak {
2525
translationInput = Math::Vector3D::Zero();
2626
velocity = Math::Vector3D::Zero();
2727

28-
EventDispatcher::RegisterEventHandler(this, &FreeLookCameraController::OnKeyPressed);
29-
EventDispatcher::RegisterEventHandler(this, &FreeLookCameraController::OnKeyReleased);
28+
m_keyPressedHandlerId = EventDispatcher::RegisterEventHandler(this, &FreeLookCameraController::OnKeyPressed);
29+
m_keyReleasedHandlerId = EventDispatcher::RegisterEventHandler(this, &FreeLookCameraController::OnKeyReleased);
30+
}
3031

32+
FreeLookCameraController::~FreeLookCameraController() {
33+
EventDispatcher::UnregisterEvent(EventType::KeyPressed, m_keyPressedHandlerId);
34+
EventDispatcher::UnregisterEvent(EventType::KeyReleased, m_keyReleasedHandlerId);
3135
}
3236

3337
bool FreeLookCameraController::Initialize() {

0 commit comments

Comments
 (0)