diff --git a/project/src/Camera.cpp b/project/src/Camera.cpp index 6dd9dfe..bc54450 100644 --- a/project/src/Camera.cpp +++ b/project/src/Camera.cpp @@ -193,7 +193,7 @@ const dae::Vector3 & dae::Camera::GetPosition() const { return origin; } -const dae::Vector3 dae::Camera::GetRotation() const { +dae::Vector3 dae::Camera::GetRotation() const { return {totalPitch, totalYaw, 0.f}; } diff --git a/project/src/Camera.h b/project/src/Camera.h index f642193..2e38e8c 100644 --- a/project/src/Camera.h +++ b/project/src/Camera.h @@ -11,7 +11,7 @@ #include "Math/Matrix.h" namespace dae { - class Camera { + class Camera final { public: Camera() = default; @@ -32,7 +32,7 @@ namespace dae { const Vector3 & GetPosition() const; void SetPosition(const Vector3& position); - const Vector3 GetRotation() const; + Vector3 GetRotation() const; void SetRotation(const Vector3& rotation); private: diff --git a/project/src/Effects/BaseEffect.h b/project/src/Effects/BaseEffect.h index f29761b..2f2ea54 100644 --- a/project/src/Effects/BaseEffect.h +++ b/project/src/Effects/BaseEffect.h @@ -1,7 +1,3 @@ -// -// Created by Bram on 20/12/2024. -// - #ifndef GP1_DIRECTX_BASEEFFECT_H #define GP1_DIRECTX_BASEEFFECT_H diff --git a/project/src/Effects/Effect.h b/project/src/Effects/Effect.h index bae4077..b5cc3e8 100644 --- a/project/src/Effects/Effect.h +++ b/project/src/Effects/Effect.h @@ -12,7 +12,7 @@ enum class CullMode { }; -class Effect: public BaseEffect { +class Effect final: public BaseEffect { public: Effect(ID3D11Device *devicePtr, const std::wstring &filePath); diff --git a/project/src/Effects/FireEffect.h b/project/src/Effects/FireEffect.h index 078f205..dd3c6c2 100644 --- a/project/src/Effects/FireEffect.h +++ b/project/src/Effects/FireEffect.h @@ -9,7 +9,7 @@ #include #include "BaseEffect.h" -class FireEffect: public BaseEffect { +class FireEffect final: public BaseEffect { public: FireEffect(ID3D11Device *devicePtr, const std::wstring &filePath); diff --git a/project/src/GamePadController.h b/project/src/GamePadController.h index ed7f161..62a30e8 100644 --- a/project/src/GamePadController.h +++ b/project/src/GamePadController.h @@ -2,16 +2,17 @@ #define GP1_DIRECTX_GAMEPADCONTROLLER_H #include +#include #include "SDL_gamecontroller.h" #include "SDL.h" struct GamePad{ - bool buttons[SDL_CONTROLLER_BUTTON_MAX]; - float axis[SDL_CONTROLLER_AXIS_MAX]; + std::array buttons{}; + std::array axis{}; - bool prevButtons[SDL_CONTROLLER_BUTTON_MAX]{ false }; + std::array prevButtons{ false }; }; enum class GamePadButton { @@ -42,7 +43,7 @@ enum class GamePadButton { enum Controllers {PLAYER1, PLAYER2, PLAYER3, PLAYER4}; -class GamePadController { +class GamePadController final { public: static GamePadController& GetInstance() @@ -66,7 +67,6 @@ private: GamePadController(); std::vector m_pGameControllers; std::vector m_GamePads; - }; diff --git a/project/src/HitTest.h b/project/src/HitTest.h index fc2eb66..09d7b9b 100644 --- a/project/src/HitTest.h +++ b/project/src/HitTest.h @@ -11,7 +11,7 @@ using namespace dae; -struct Sample +struct Sample final { Vector2 uv{}; Vector3 normal{}; diff --git a/project/src/InstancedMesh.cpp b/project/src/InstancedMesh.cpp index 3d92b63..fb675b5 100644 --- a/project/src/InstancedMesh.cpp +++ b/project/src/InstancedMesh.cpp @@ -2,8 +2,8 @@ #include "InstancedMesh.h" InstancedMesh::InstancedMesh(ID3D11Device *devicePtr, const std::vector &verticesIn, const std::vector &indices, - std::shared_ptr material, BaseEffect *effectPtr, const std::vector &instanceData) - : m_EffectPtr(effectPtr), + std::shared_ptr material, std::unique_ptr effectPtr, const std::vector &instanceData) + : m_EffectPtr(std::move(effectPtr)), m_InputLayoutPtr(nullptr), m_VertexBufferPtr(nullptr), m_IndexBufferPtr(nullptr), @@ -152,9 +152,6 @@ InstancedMesh::~InstancedMesh() { m_InstanceBufferPtr = nullptr; } - delete m_EffectPtr; - m_EffectPtr = nullptr; - m_Material.reset(); m_InstancedData.clear(); diff --git a/project/src/InstancedMesh.h b/project/src/InstancedMesh.h index d110bbc..e0a7ffb 100644 --- a/project/src/InstancedMesh.h +++ b/project/src/InstancedMesh.h @@ -13,10 +13,10 @@ struct alignas(16) InstancedData { Vector4 color; }; -class InstancedMesh { +class InstancedMesh final { public: InstancedMesh(ID3D11Device *devicePtr, const std::vector &verticesIn, const std::vector &indices, - std::shared_ptr material, BaseEffect* effectPtr, const std::vector& instanceData); + std::shared_ptr material, std::unique_ptr effectPtr, const std::vector& instanceData); ~InstancedMesh(); @@ -26,7 +26,6 @@ public: Matrix GetWorldMatrix() const; - Material* GetMaterial() const; void SetWorldMatrix(const Matrix &matrix); @@ -40,7 +39,7 @@ public: void UpdateInstanceData(ID3D11DeviceContext* deviceContextPtr, const std::vector& instanceData); private: - BaseEffect *m_EffectPtr; + std::unique_ptr m_EffectPtr; Matrix m_WorldMatrix{}; diff --git a/project/src/Material.h b/project/src/Material.h index 8d9dcdc..fd25b02 100644 --- a/project/src/Material.h +++ b/project/src/Material.h @@ -3,7 +3,7 @@ #include "Texture.h" -struct Material { +struct Material final { Texture *diffuseTexturePtr{nullptr}; Texture *normalTexturePtr{nullptr}; Texture *specularTexturePtr{nullptr}; diff --git a/project/src/Mesh.cpp b/project/src/Mesh.cpp index 9b7a679..48c1c7a 100644 --- a/project/src/Mesh.cpp +++ b/project/src/Mesh.cpp @@ -5,8 +5,8 @@ #include "Effects/Effect.h" -Mesh::Mesh(ID3D11Device *devicePtr, const std::vector &verticesIn, const std::vector &indices, std::shared_ptr material, BaseEffect* effectPtr) : - m_EffectPtr(effectPtr), +Mesh::Mesh(ID3D11Device *devicePtr, const std::vector &verticesIn, const std::vector &indices, std::shared_ptr material, std::unique_ptr effectPtr) : + m_EffectPtr(std::move(effectPtr)), m_InputLayoutPtr(nullptr), m_VertexBufferPtr(nullptr), m_IndexBufferPtr(nullptr), @@ -91,8 +91,6 @@ Mesh::~Mesh() { m_IndexBufferPtr->Release(); m_IndexBufferPtr = nullptr; - delete m_EffectPtr; - m_EffectPtr = nullptr; } void Mesh::Render(ID3D11DeviceContext *deviceContextPtr, const Matrix &worldViewProj) const { diff --git a/project/src/Mesh.h b/project/src/Mesh.h index 137a1bb..d1127b3 100644 --- a/project/src/Mesh.h +++ b/project/src/Mesh.h @@ -19,12 +19,10 @@ enum class PrimitiveTopology { }; - - class Mesh final { public: Mesh(ID3D11Device *devicePtr, const std::vector &verticesIn, const std::vector &indices, - std::shared_ptr material, BaseEffect* effectPtr); + std::shared_ptr material, std::unique_ptr effectPtr); ~Mesh(); @@ -54,7 +52,7 @@ public: bool GetShouldRender() const { return m_ShouldRender; } private: - BaseEffect *m_EffectPtr; + std::unique_ptr m_EffectPtr; Matrix m_WorldMatrix{}; diff --git a/project/src/Renderer.cpp b/project/src/Renderer.cpp index ab8e3b8..b6d8561 100644 --- a/project/src/Renderer.cpp +++ b/project/src/Renderer.cpp @@ -36,14 +36,14 @@ namespace dae { InitializeSDLRasterizer(); - m_pScene = new MainScene(); + m_pScene = std::make_unique(); m_pScene->Initialize(m_DevicePtr, m_DeviceContextPtr, nullptr); if (!m_pScene->GetMeshes().empty()) { - m_pFireMesh = m_pScene->GetMeshes().back(); + m_pFireMesh = m_pScene->GetMeshes().back().get(); } - float aspectRatio = static_cast(m_Width) / static_cast(m_Height); + const float aspectRatio = static_cast(m_Width) / static_cast(m_Height); m_Camera = Camera({.0f, .0f, .0f}, 45.f); m_Camera.Initialize(45.f, {.0f, .0f, .0f}, aspectRatio); } @@ -66,7 +66,6 @@ namespace dae { m_DevicePtr->Release(); m_pScene->Cleanup(); - delete m_pScene; //SDL SDL_FreeSurface(m_pBackBuffer); @@ -79,7 +78,7 @@ namespace dae { void Renderer::Update(const Timer *pTimer) { m_Camera.Update(pTimer); - for (auto mesh: m_pScene->GetMeshes()) { + for (auto& mesh: m_pScene->GetMeshes()) { mesh->SetCameraPos(m_Camera.GetPosition()); } if (m_Rotating) { @@ -89,7 +88,7 @@ namespace dae { Matrix rotationMatrix = Matrix::CreateRotationY(rotationThisFrame); - for (auto mesh: m_pScene->GetMeshes()) { + for (auto& mesh: m_pScene->GetMeshes()) { Matrix originalWorldMatrix = mesh->GetWorldMatrix(); Matrix world = rotationMatrix * originalWorldMatrix; @@ -121,7 +120,7 @@ namespace dae { m_DeviceContextPtr->ClearDepthStencilView(m_DepthStencilViewPtr, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); Matrix viewProjMatrix = m_Camera.GetViewProjectionMatrix(); - for (auto mesh: m_pScene->GetMeshes()) { + for (auto& mesh: m_pScene->GetMeshes()) { if (mesh->GetShouldRender()) { Matrix modelMatrix = mesh->GetWorldMatrix(); Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix; @@ -149,14 +148,14 @@ namespace dae { m_VerticiesScreenSpace.clear(); - for (auto *currentMesh: m_pScene->GetMeshes()) { + for (auto& currentMesh: m_pScene->GetMeshes()) { if (!currentMesh->GetShouldRender()) { continue; } const Matrix worldViewProjectionMatrix{currentMesh->GetWorldMatrix() * m_Camera.GetViewProjectionMatrix()}; - VertexTransformationFunction(worldViewProjectionMatrix, currentMesh, currentMesh->GetVertices(), m_VerticiesScreenSpace); + VertexTransformationFunction(worldViewProjectionMatrix, currentMesh.get(), currentMesh->GetVertices(), m_VerticiesScreenSpace); int numTriangles{}; @@ -535,7 +534,7 @@ namespace dae { } void Renderer::CycleCullMode() { - for (auto mesh: m_pScene->GetMeshes()) { + for (auto& mesh: m_pScene->GetMeshes()) { mesh->CycleCullMode(); } @@ -604,7 +603,7 @@ namespace dae { } void Renderer::NextSamplingState() { - for (auto mesh: m_pScene->GetMeshes()) { + for (auto& mesh: m_pScene->GetMeshes()) { mesh->NextSamplingState(); } @@ -629,7 +628,7 @@ namespace dae { void Renderer::ToggleNormals() { m_useNormals = !m_useNormals; - for (auto mesh: m_pScene->GetMeshes()) { + for (auto& mesh: m_pScene->GetMeshes()) { mesh->ToggleNormals(); } std::string mode = m_useNormals ? "ON" : "OFF"; @@ -658,7 +657,6 @@ namespace dae { void Renderer::NextScene() { m_pScene->Cleanup(); - delete m_pScene; //Calculate the next scene int index = static_cast(m_CurrentScene); @@ -667,27 +665,27 @@ namespace dae { switch (m_CurrentScene) { case SceneNames::Main: - m_pScene = new MainScene(); + m_pScene = std::make_unique(); m_pFireMesh = nullptr; std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Main" << RESET << std::endl; std::cout << MAGENTA << "This could take a second" << RESET << std::endl; break; case SceneNames::Diorama: - m_pScene = new DioramaScene(); + m_pScene = std::make_unique(); std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Diorama" << RESET << std::endl; std::cout << MAGENTA << "This could take a second" << RESET << std::endl; break; case SceneNames::Instanced: - m_pScene = new InstancedScene(); + m_pScene = std::make_unique(); std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Instanced" << RESET << std::endl; std::cout << MAGENTA << "This could take a second" << RESET << std::endl; break; case SceneNames::Planet: - m_pScene = new PlanetScene(); + m_pScene = std::make_unique(); std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Planet" << RESET << std::endl; std::cout << MAGENTA << "This could take a second" << RESET << std::endl; @@ -705,7 +703,7 @@ namespace dae { if (m_CurrentScene == SceneNames::Main) { //Kind of sloppy fix but hey :p - m_pFireMesh = m_pScene->GetMeshes().back(); + m_pFireMesh = m_pScene->GetMeshes().back().get(); } } diff --git a/project/src/Renderer.h b/project/src/Renderer.h index d5b2797..ba7b472 100644 --- a/project/src/Renderer.h +++ b/project/src/Renderer.h @@ -79,7 +79,7 @@ namespace dae Backendtype m_backendType{ Backendtype::DirectX }; - BaseScene* m_pScene{}; + std::unique_ptr m_pScene{}; SceneNames m_CurrentScene{ SceneNames::Main }; //Pos rot std::unordered_map> m_SceneCameraPositions{}; @@ -90,7 +90,7 @@ namespace dae float m_currentRotation{}; bool m_UseUniformClearColor{ false }; - ColorRGB m_UniformClearColor{ ColorRGB{0.1f * 255.f, 0.1f * 255.f, 0.1 * 255.f} }; + const ColorRGB m_UniformClearColor{ ColorRGB{0.1f * 255.f, 0.1f * 255.f, 0.1 * 255.f} }; //DirectX vars @@ -100,7 +100,7 @@ namespace dae HRESULT InitializeDirectX(); void RenderDirectX() const; - ColorRGB DirectXClearColor{ .39f * 255.f, .59f * 255.f, .93f * 255.f }; + const ColorRGB DirectXClearColor{ .39f * 255.f, .59f * 255.f, .93f * 255.f }; //Storing the mesh so i can deactivate it; Mesh* m_pFireMesh{}; @@ -134,7 +134,7 @@ namespace dae bool m_isDepthBuffer{ false }; - ColorRGB m_ClearColorSoftware{ .39f * 255.f, .39f * 255.f, .39f * 255.f }; + const ColorRGB m_ClearColorSoftware{ .39f * 255.f, .39f * 255.f, .39f * 255.f }; float* m_pDepthBufferPixels{}; diff --git a/project/src/Scenes/BaseScene.h b/project/src/Scenes/BaseScene.h index 8cfa842..9dc6253 100644 --- a/project/src/Scenes/BaseScene.h +++ b/project/src/Scenes/BaseScene.h @@ -25,7 +25,7 @@ public: virtual void Cleanup() = 0; - virtual std::vector& GetMeshes() = 0; + virtual std::vector>& GetMeshes() = 0; virtual std::vector>& GetMaterials() = 0; }; diff --git a/project/src/Scenes/DioramaScene.cpp b/project/src/Scenes/DioramaScene.cpp index 63ba776..855fbd4 100644 --- a/project/src/Scenes/DioramaScene.cpp +++ b/project/src/Scenes/DioramaScene.cpp @@ -15,19 +15,20 @@ void DioramaScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devi std::vector> materialMeshes; Utils::LoadObjWithMaterials("resources/scene.obj", materialMeshes, true, DevicePtr); for (const auto &mesh: materialMeshes) { - if (mesh->vertices.size() > 0) { + if (!mesh->vertices.empty()) { std::shared_ptr material = std::make_shared(); - BaseEffect *effect{nullptr}; + std::unique_ptr effect{}; - if (mesh->opacity_map != "") { - effect = new FireEffect(DevicePtr, L"resources/Fire.fx"); + if (!mesh->opacity_map.empty()) { + effect = std::make_unique(DevicePtr, L"resources/Fire.fx"); material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); } else { material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); - effect = new Effect(DevicePtr, L"resources/SimpleDiffuse.fx"); + effect = std::make_unique(DevicePtr, L"resources/SimpleDiffuse.fx"); } + auto newMesh = std::make_unique(DevicePtr, mesh->vertices, mesh->indices, material, std::move(effect)); + m_meshes.push_back(std::move(newMesh)); - m_meshes.push_back(new Mesh(DevicePtr, mesh->vertices, mesh->indices, material, effect)); Matrix worldMatrix = m_meshes.back()->GetWorldMatrix(); worldMatrix *= Matrix::CreateScale(2.f, 2.f, 2.f); @@ -42,13 +43,15 @@ void DioramaScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devi for (const auto &mesh: materialMeshes) { if (!mesh->vertices.empty()) { std::shared_ptr material = std::make_shared(); - BaseEffect *effect{nullptr}; + auto effect = std::make_unique(DevicePtr, L"resources/SimpleDiffuse.fx"); - effect = new Effect(DevicePtr, L"resources/SimpleDiffuse.fx"); material->diffuseTexturePtr = Texture::LoadFromFile("./resources/brok/" + mesh->diffuse_texture, DevicePtr); - m_meshes.push_back(new Mesh(DevicePtr, mesh->vertices, mesh->indices, material, effect)); - m_brokMeshses.push_back(m_meshes.back()); + + auto brokMesh = std::make_unique(DevicePtr, mesh->vertices, mesh->indices, material, std::move(effect)); + m_brokMeshses.push_back(brokMesh.get()); + m_meshes.push_back(std::move(brokMesh)); + Matrix worldMatrix = m_meshes.back()->GetWorldMatrix(); worldMatrix *= Matrix::CreateRotationY(3.14f / 2.f); @@ -81,7 +84,7 @@ void DioramaScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView } -std::vector &DioramaScene::GetMeshes() { +std::vector> &DioramaScene::GetMeshes() { return m_meshes; } @@ -90,9 +93,6 @@ std::vector> &DioramaScene::GetMaterials() { } void DioramaScene::Cleanup() { - for (Mesh *mesh: m_meshes) { - delete mesh; - } m_meshes.clear(); m_materials.clear(); } \ No newline at end of file diff --git a/project/src/Scenes/DioramaScene.h b/project/src/Scenes/DioramaScene.h index e288162..2341622 100644 --- a/project/src/Scenes/DioramaScene.h +++ b/project/src/Scenes/DioramaScene.h @@ -3,13 +3,13 @@ #include "BaseScene.h" -class DioramaScene : public BaseScene { +class DioramaScene final : public BaseScene { public: void Cleanup() override; void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override; - std::vector &GetMeshes() override; + std::vector> &GetMeshes() override; std::vector> &GetMaterials() override; @@ -18,7 +18,7 @@ public: void Render(ID3D11DeviceContext* devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, ID3D11DepthStencilView *depthStencilViewPtr, const Camera& camera) override; private: - std::vector m_meshes{}; + std::vector> m_meshes{}; std::vector> m_materials{}; std::vector m_brokMeshses{ nullptr }; diff --git a/project/src/Scenes/InstancedScene.cpp b/project/src/Scenes/InstancedScene.cpp index 7688621..8f24330 100644 --- a/project/src/Scenes/InstancedScene.cpp +++ b/project/src/Scenes/InstancedScene.cpp @@ -43,7 +43,9 @@ void InstancedScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *De float scale = 2; //use the perlin noise to generate the YOffset - float YOffset = sin(x * 0.5f + SDL_GetTicks() * 0.001f) + cos(y * 0.5f + SDL_GetTicks() * 0.001f); + float currentTick = static_cast(SDL_GetTicks()); + + float YOffset = sin(x * 0.5f +currentTick * 0.001f) + cos(y * 0.5f + currentTick * 0.001f); data.worldMatrix = Matrix::CreateTranslation(x * scale, YOffset, y * scale); data.worldMatrix *= Matrix::CreateScale(0.5f, 0.5f, 0.5f); data.color = Vector4(float(x) / 255.f, float(y) / 255.f, 1.f, 1.0f); @@ -51,26 +53,20 @@ void InstancedScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *De } } - auto *effect = new Effect(DevicePtr, L"resources/InstancedSimpleDiffuse.fx"); + auto effect = std::make_unique(DevicePtr, L"resources/InstancedSimpleDiffuse.fx"); effect->NextSamplingState(); effect->NextSamplingState(); //Dirty hack - m_instancedMeshes.push_back(new InstancedMesh(DevicePtr, vertices, indices, cubeMaterial, effect, instanceData)); + + auto cubeMesh = std::make_unique(DevicePtr, vertices, indices, cubeMaterial, std::move(effect), instanceData); + m_instancedMeshes.push_back(std::move(cubeMesh)); } void InstancedScene::Cleanup() { - for (auto mesh: m_instancedMeshes) { - delete mesh; - } m_instancedMeshes.clear(); - - for (auto mesh: m_meshes) { - delete mesh; - } - m_meshes.clear(); } -std::vector &InstancedScene::GetMeshes() { +std::vector> &InstancedScene::GetMeshes() { return m_meshes; } @@ -81,7 +77,7 @@ std::vector> &InstancedScene::GetMaterials() { void InstancedScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, ID3D11DepthStencilView *depthStencilViewPtr, const Camera &camera) { Matrix viewProjMatrix = camera.GetViewProjectionMatrix(); - for (auto mesh: m_instancedMeshes) { + for (auto& mesh: m_instancedMeshes) { Matrix modelMatrix = mesh->GetWorldMatrix(); Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix; mesh->Render(devicePtr, worldViewProjMatrix); @@ -96,8 +92,9 @@ void InstancedScene::Update() { InstancedData data; float scale = 2; //Generate sine wave based on x and y and the SDL_GetTicks - float YOffset = sin(x * 0.5f + SDL_GetTicks() * 0.001f) + cos(y * 0.5f + SDL_GetTicks() * 0.001f); - YOffset += (x * 0.1f + y * 0.1f) * 0.1f; + float currentTick = static_cast(SDL_GetTicks()); + float YOffset = sin(static_cast(x) * 0.5f + currentTick * 0.001f) + cos(static_cast(y) * 0.5f + currentTick * 0.001f); + YOffset += (static_cast(x) * 0.1f + static_cast(y) * 0.1f) * 0.1f; data.worldMatrix = Matrix::CreateTranslation(x * scale, YOffset, y * scale); data.worldMatrix *= Matrix::CreateScale(0.5f, 0.5f, 0.5f); diff --git a/project/src/Scenes/InstancedScene.h b/project/src/Scenes/InstancedScene.h index 9df5156..34d83d5 100644 --- a/project/src/Scenes/InstancedScene.h +++ b/project/src/Scenes/InstancedScene.h @@ -6,7 +6,7 @@ #include "../InstancedMesh.h" #include "../PerlinNoise.hpp" -class InstancedScene : public BaseScene { +class InstancedScene final : public BaseScene { public: void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override; @@ -16,7 +16,7 @@ public: void Cleanup() override; - std::vector &GetMeshes() override; + std::vector> &GetMeshes() override; std::vector> &GetMaterials() override; @@ -24,9 +24,9 @@ private: ID3D11DeviceContext* m_DeviceContextPtr{}; - std::vector m_meshes; + std::vector> m_meshes; //Kind of hack since InstancedMesh doesnt extend mesh - std::vector m_instancedMeshes; + std::vector> m_instancedMeshes; std::vector> m_materials; const siv::PerlinNoise::seed_type seed = 123456u; diff --git a/project/src/Scenes/MainScene.cpp b/project/src/Scenes/MainScene.cpp index 8aaa3c0..383d9e4 100644 --- a/project/src/Scenes/MainScene.cpp +++ b/project/src/Scenes/MainScene.cpp @@ -26,8 +26,9 @@ void MainScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceC vehicleMaterial->specularTexturePtr = Texture::LoadFromFile("resources/vehicle_specular.png", DevicePtr); vehicleMaterial->glossTexturePtr = Texture::LoadFromFile("resources/vehicle_gloss.png", DevicePtr); - auto* effect = new Effect(DevicePtr, L"resources/PosCol3D.fx"); - m_meshes.push_back(new Mesh(DevicePtr, vertices, indices, vehicleMaterial, effect)); + auto effect = std::make_unique(DevicePtr, L"resources/PosCol3D.fx"); + auto vehicleMesh = std::make_unique(DevicePtr, vertices, indices, vehicleMaterial, std::move(effect)); + m_meshes.push_back(std::move(vehicleMesh)); Matrix worldMatrix = m_meshes.back()->GetWorldMatrix(); @@ -45,8 +46,9 @@ void MainScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceC std::shared_ptr FireMaterial = std::make_shared(); FireMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/fireFX_diffuse.png", DevicePtr); - auto* fireEffect = new FireEffect(DevicePtr, L"resources/Fire.fx"); - m_meshes.push_back(new Mesh(DevicePtr, vertices, indices, FireMaterial, fireEffect)); + auto fireEffect = std::make_unique(DevicePtr, L"resources/Fire.fx"); + auto fireMesh = std::make_unique(DevicePtr, vertices, indices, FireMaterial, std::move(fireEffect)); + m_meshes.push_back(std::move(fireMesh)); worldMatrix = m_meshes.back()->GetWorldMatrix(); worldMatrix *= Matrix::CreateTranslation(0, 0, 50.f); @@ -55,13 +57,10 @@ void MainScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceC void MainScene::Cleanup() { - for (Mesh* mesh : m_meshes) { - delete mesh; - } m_meshes.clear(); } -std::vector &MainScene::GetMeshes() { +std::vector> &MainScene::GetMeshes() { return m_meshes; } diff --git a/project/src/Scenes/MainScene.h b/project/src/Scenes/MainScene.h index e90b0d6..982c87f 100644 --- a/project/src/Scenes/MainScene.h +++ b/project/src/Scenes/MainScene.h @@ -10,13 +10,13 @@ #include #include -class MainScene : public BaseScene { +class MainScene final : public BaseScene { public: void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override; void Cleanup() override; - std::vector &GetMeshes() override; + std::vector> &GetMeshes() override; std::vector> &GetMaterials() override; @@ -27,7 +27,7 @@ public: private: - std::vector m_meshes{}; + std::vector> m_meshes{}; std::vector> m_materials{}; }; diff --git a/project/src/Scenes/PlanetScene.cpp b/project/src/Scenes/PlanetScene.cpp index 8790986..37591eb 100644 --- a/project/src/Scenes/PlanetScene.cpp +++ b/project/src/Scenes/PlanetScene.cpp @@ -60,8 +60,9 @@ void PlanetScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devic m_InstancedData.push_back(data); } - auto *rockEffect = new Effect(DevicePtr, L"resources/InstancedSimpleDiffuse.fx"); - m_instancedMeshes.push_back(new InstancedMesh(DevicePtr, vertices, indices, rockMaterial, rockEffect, m_InstancedData)); + auto rockEffect = std::make_unique(DevicePtr, L"resources/InstancedSimpleDiffuse.fx"); + auto rockMesh = std::make_unique(DevicePtr, vertices, indices, rockMaterial, std::move(rockEffect), m_InstancedData); + m_instancedMeshes.push_back(std::move(rockMesh)); indices.clear(); vertices.clear(); @@ -74,8 +75,10 @@ void PlanetScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devic std::shared_ptr planetMaterial = std::make_shared(); planetMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/planet/mars.png", DevicePtr); - auto* planetEffect = new Effect(DevicePtr, L"resources/SimpleDiffuse.fx"); - m_meshes.push_back(new Mesh(DevicePtr, vertices, indices, planetMaterial, planetEffect)); + auto planetEffect = std::make_unique(DevicePtr, L"resources/SimpleDiffuse.fx"); + auto planetMesh = std::make_unique(DevicePtr, vertices, indices, planetMaterial, std::move(planetEffect)); + m_planetMesh = planetMesh.get(); + m_meshes.push_back(std::move(planetMesh)); indices.clear(); vertices.clear(); @@ -88,9 +91,10 @@ void PlanetScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devic std::shared_ptr skyboxMaterial = std::make_shared(); skyboxMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/planet/skybox/space_nebula_6k.png", DevicePtr); - auto* skyboxEffect = new Effect(DevicePtr, L"resources/SimpleDiffuse.fx"); - m_meshes.push_back(new Mesh(DevicePtr, vertices, indices, skyboxMaterial, skyboxEffect)); - m_skyboxMesh = m_meshes.back(); + auto skyboxEffect = std::make_unique(DevicePtr, L"resources/SimpleDiffuse.fx"); + auto skyBoxMesh = std::make_unique(DevicePtr, vertices, indices, skyboxMaterial, std::move(skyboxEffect)); + m_meshes.push_back(std::move(skyBoxMesh)); + m_skyboxMesh = m_meshes.back().get(); Matrix worldMatrix = m_meshes.back()->GetWorldMatrix(); worldMatrix *= Matrix::CreateScale(0.1f, 0.1f, 0.1f); @@ -98,19 +102,12 @@ void PlanetScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devic } void PlanetScene::Cleanup() { - for (auto mesh: m_instancedMeshes) { - delete mesh; - } m_instancedMeshes.clear(); - for (auto mesh: m_meshes) { - delete mesh; - } - m_meshes.clear(); } -std::vector &PlanetScene::GetMeshes() { +std::vector> &PlanetScene::GetMeshes() { return m_meshes; } @@ -121,7 +118,7 @@ std::vector> &PlanetScene::GetMaterials() { void PlanetScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, ID3D11DepthStencilView *depthStencilViewPtr, const Camera &camera) { Matrix viewProjMatrix = camera.GetViewProjectionMatrix(); - for (auto mesh: m_instancedMeshes) { + for (auto& mesh: m_instancedMeshes) { Matrix modelMatrix = mesh->GetWorldMatrix(); Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix; mesh->Render(devicePtr, worldViewProjMatrix); @@ -137,8 +134,13 @@ void PlanetScene::Update() { //set the skybox to the camera Matrix skyboxMatrix = m_skyboxMesh->GetWorldMatrix(); - Vector3 cameraPos = m_Camera->GetPosition(); skyboxMatrix.SetTranslation(cameraPos); m_skyboxMesh->SetWorldMatrix(skyboxMatrix); + + //Rotate the planet slowly + Matrix planetMatrix = m_planetMesh->GetWorldMatrix(); + planetMatrix *= Matrix::CreateRotationY(-0.0001f); + m_planetMesh->SetWorldMatrix(planetMatrix); + } diff --git a/project/src/Scenes/PlanetScene.h b/project/src/Scenes/PlanetScene.h index 60581d4..1278dd5 100644 --- a/project/src/Scenes/PlanetScene.h +++ b/project/src/Scenes/PlanetScene.h @@ -6,7 +6,7 @@ #include "BaseScene.h" #include "../InstancedMesh.h" -class PlanetScene : public BaseScene { +class PlanetScene final : public BaseScene { public: void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override; @@ -16,7 +16,7 @@ public: void Cleanup() override; - std::vector &GetMeshes() override; + std::vector> &GetMeshes() override; std::vector> &GetMaterials() override; @@ -24,13 +24,14 @@ private: ID3D11DeviceContext* m_DeviceContextPtr{}; - std::vector m_meshes; + std::vector> m_meshes; //Kind of hack since InstancedMesh doesnt extend mesh - std::vector m_instancedMeshes; + std::vector> m_instancedMeshes; std::vector m_InstancedData; std::vector> m_materials; Mesh* m_skyboxMesh; + Mesh* m_planetMesh; Camera* m_Camera; }; diff --git a/project/src/Texture.h b/project/src/Texture.h index 533ee41..85ecc9c 100644 --- a/project/src/Texture.h +++ b/project/src/Texture.h @@ -12,7 +12,7 @@ using namespace dae; -class Texture { +class Texture final { public: ~Texture(); @@ -28,7 +28,7 @@ private: ID3D11ShaderResourceView* m_TextureResourceViewPtr{}; ID3D11Texture2D* m_TexturePtr{}; - SDL_Surface* m_SurfacePtr{ nullptr }; + const SDL_Surface* m_SurfacePtr{ nullptr }; uint32_t* m_pSurfacePixels{ nullptr }; }; diff --git a/project/src/Timer.h b/project/src/Timer.h index bc2bb9a..6d8713a 100644 --- a/project/src/Timer.h +++ b/project/src/Timer.h @@ -5,7 +5,7 @@ namespace dae { - class Timer + class Timer final { public: Timer(); diff --git a/project/src/Utils.h b/project/src/Utils.h index 50213e9..885237c 100644 --- a/project/src/Utils.h +++ b/project/src/Utils.h @@ -395,4 +395,14 @@ namespace dae { } } -} \ No newline at end of file +} + +template +class DirectXDeleter +{ +public: + void operator()(T* p) + { + p->Release(); + } +}; diff --git a/project/src/main.cpp b/project/src/main.cpp index 8f1b2a4..2ff4a15 100644 --- a/project/src/main.cpp +++ b/project/src/main.cpp @@ -129,8 +129,11 @@ int main(int argc, char *args[]) { //Create window + surfaces SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK); - const uint32_t width = 640; - const uint32_t height = 480; + const uint32_t width = 1600; + const uint32_t height = 900; + +//// const uint32_t width = 640; +//// const uint32_t height = 480; SDL_Window *pWindow = SDL_CreateWindow(