Skip to content

Commit 9725e35

Browse files
committed
Fix multiple memory issues. Meshes with enabled shadow mapping are invisible.
- Fix use-after-free when an Camera object is selected, then the editor is closed - Fix heap-buffer-overrun inside ForwardRenderer by updating owner references of RenderingManager by using an custom move ctor - Properly set vertex topology in ForwardRenderer + ShadowMapRenderer - Fix memory leak in RenderingManager::Execute (the meshpart list wasn't cleared each draw cycle) - Constant buffer mem copy corectness - Fix memcpy failed assert when selecting an object: The matrix structure is optimised out of the pixel shader - Fixed the wireframe selection effect being hiddern by swapping the drawing order of the mesh and wireframe
1 parent cf4090d commit 9725e35

12 files changed

Lines changed: 53 additions & 14 deletions

File tree

3DRadSpace/3DRadSpace_Editor_WindowsDX11/Frontend/Windows/EditorWindow.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,7 @@ void EditorWindow::Run()
595595
cmd->SetViewport();
596596
cmd->Clear(editor->ClearColor);
597597
this->editor->Draw3D();
598+
this->editor->RenderingManager->Execute();
598599
this->editor->PostProcesses->ApplyAll();
599600
this->editor->Draw2D();
600601
cmd->Present();

3DRadSpace/Engine3DRadSpace/Games/Game.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ namespace Engine3DRadSpace
5959
std::unique_ptr<Audio::IAudioEngine> Audio;
6060
std::unique_ptr<Graphics::Rendering::PostProcessCollection> PostProcesses;
6161

62-
std::unique_ptr<Objects::ObjectList> Objects;
6362
std::unique_ptr<Objects::CameraProvider> Cameras;
63+
std::unique_ptr<Objects::ObjectList> Objects;
6464

6565
IService* RequireService(const std::type_index& type);
6666

3DRadSpace/Engine3DRadSpace/Graphics/DirectX11/ShaderBase.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,10 @@ void ShaderBase::SetData(unsigned index, const void* data, size_t dataSize)
126126
if (ptr == nullptr)
127127
{
128128
constantBuff.Buffer = std::make_unique<std::byte[]>(dataSize);
129+
constantBuff.Size = dataSize;
129130
ptr = constantBuff.Buffer.get();
130131
}
131-
memcpy_s(ptr, dataSize, data, dataSize);
132+
memcpy_s(ptr, constantBuff.Size, data, dataSize);
132133

133134
if (handle == nullptr)
134135
{

3DRadSpace/Engine3DRadSpace/Graphics/IShader.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ namespace Engine3DRadSpace::Graphics
5151
Set(name, &data, sizeof(T));
5252
}
5353

54+
template<typename T>
55+
void SetData(const T* data, unsigned index)
56+
{
57+
SetData(index, data, sizeof(T));
58+
}
59+
5460
virtual std::string_view GetEntryName() const noexcept = 0;
5561
virtual const char* GetCompilationErrorsAndWarnings() const noexcept = 0;
5662

3DRadSpace/Engine3DRadSpace/Graphics/Rendering/ForwardRenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ void ForwardRenderer::Draw(ModelMeshPart* part, const MaterialDescriptor* materi
157157
effect->SetSampler(samplerState.get(), idTexture++);
158158
}
159159

160+
_context->SetTopology(VertexTopology::TriangleList);
160161
_context->DrawVertexBufferWithindices(
161162
part->GetVertexBuffer(),
162163
part->GetIndexBuffer()

3DRadSpace/Engine3DRadSpace/Graphics/Rendering/IRenderer.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,7 @@ namespace Engine3DRadSpace::Graphics::Rendering
4747
virtual bool IsRenderPassTypeSupported(RenderPassType passType) const noexcept = 0;
4848

4949
virtual ~IRenderer() = default;
50+
51+
friend class RenderingManager;
5052
};
5153
}

3DRadSpace/Engine3DRadSpace/Graphics/Rendering/RenderingManager.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,35 @@ RenderingManager::RenderingManager(IGraphicsDevice* device) :
1414
{
1515
}
1616

17+
RenderingManager::RenderingManager(RenderingManager&& other) noexcept :
18+
_device(other._device),
19+
_renderers(std::move(other._renderers)),
20+
_meshParts(std::move(other._meshParts))
21+
{
22+
for (auto& renderer : _renderers)
23+
{
24+
renderer->_owner = this;
25+
}
26+
27+
other._device = nullptr;
28+
}
29+
30+
RenderingManager& RenderingManager::operator=(RenderingManager&& other) noexcept
31+
{
32+
if (this != &other)
33+
{
34+
_device = other._device;
35+
_renderers = std::move(other._renderers);
36+
_meshParts = std::move(other._meshParts);
37+
for (auto& renderer : _renderers)
38+
{
39+
renderer->_owner = this;
40+
}
41+
other._device = nullptr;
42+
}
43+
return *this;
44+
}
45+
1746
void RenderingManager::Add(std::unique_ptr<IRenderer>&& renderPass)
1847
{
1948
_renderers.emplace_back(std::move(renderPass));
@@ -57,6 +86,8 @@ void RenderingManager::Execute()
5786

5887
renderer->End();
5988
}
89+
90+
_meshParts.clear();
6091
}
6192

6293
void RenderingManager::Draw(Model3D* model, RenderPassType passType)

3DRadSpace/Engine3DRadSpace/Graphics/Rendering/RenderingManager.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ namespace Engine3DRadSpace::Graphics::Rendering
3131
/// <param name="device">Graphics device to use for rendering.</param>
3232
RenderingManager(IGraphicsDevice* device);
3333

34-
RenderingManager(RenderingManager&&) = default;
35-
RenderingManager& operator=(RenderingManager&&) = default;
34+
RenderingManager(RenderingManager&&) noexcept;
35+
RenderingManager& operator=(RenderingManager&&) noexcept;
3636

3737
/// <summary>
3838
/// Emplaces a new renderer of type R with the given arguments.

3DRadSpace/Engine3DRadSpace/Graphics/Rendering/ShadowMapRenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ void ShadowMapRenderer::Draw(ModelMeshPart* part, const MaterialDescriptor* mate
156156

157157
_shadowMapEffect->SetData<Math::Matrix4x4>(&lvp, 0);
158158

159+
_context->SetTopology(VertexTopology::TriangleList);
159160
_context->DrawVertexBufferWithindices(
160161
part->GetVertexBuffer(),
161162
part->GetIndexBuffer()

3DRadSpace/Engine3DRadSpace/Graphics/Rendering/ShadowMapRenderer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace Engine3DRadSpace::Graphics::Rendering
2020
void _createShadowStates();
2121
void _loadEffect();
2222
public:
23-
ShadowMapRenderer(RenderingManager* owner);
23+
explicit ShadowMapRenderer(RenderingManager* owner);
2424

2525
/// <summary>
2626
/// Defines the size of the shadow map as a multiplier of the screen resolution.

0 commit comments

Comments
 (0)