Unique Ptrs, Const correctness
This commit is contained in:
@@ -25,7 +25,7 @@ public:
|
||||
|
||||
virtual void Cleanup() = 0;
|
||||
|
||||
virtual std::vector<Mesh*>& GetMeshes() = 0;
|
||||
virtual std::vector<std::unique_ptr<Mesh>>& GetMeshes() = 0;
|
||||
virtual std::vector<std::shared_ptr<Material>>& GetMaterials() = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -15,19 +15,20 @@ void DioramaScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devi
|
||||
std::vector<std::unique_ptr<Utils::MaterialMesh>> 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> material = std::make_shared<Material>();
|
||||
BaseEffect *effect{nullptr};
|
||||
std::unique_ptr<BaseEffect> effect{};
|
||||
|
||||
if (mesh->opacity_map != "") {
|
||||
effect = new FireEffect(DevicePtr, L"resources/Fire.fx");
|
||||
if (!mesh->opacity_map.empty()) {
|
||||
effect = std::make_unique<FireEffect>(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<Effect>(DevicePtr, L"resources/SimpleDiffuse.fx");
|
||||
}
|
||||
auto newMesh = std::make_unique<Mesh>(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> material = std::make_shared<Material>();
|
||||
BaseEffect *effect{nullptr};
|
||||
auto effect = std::make_unique<Effect>(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<Mesh>(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<Mesh *> &DioramaScene::GetMeshes() {
|
||||
std::vector<std::unique_ptr<Mesh>> &DioramaScene::GetMeshes() {
|
||||
return m_meshes;
|
||||
}
|
||||
|
||||
@@ -90,9 +93,6 @@ std::vector<std::shared_ptr<Material>> &DioramaScene::GetMaterials() {
|
||||
}
|
||||
|
||||
void DioramaScene::Cleanup() {
|
||||
for (Mesh *mesh: m_meshes) {
|
||||
delete mesh;
|
||||
}
|
||||
m_meshes.clear();
|
||||
m_materials.clear();
|
||||
}
|
||||
@@ -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<Mesh *> &GetMeshes() override;
|
||||
std::vector<std::unique_ptr<Mesh>> &GetMeshes() override;
|
||||
|
||||
std::vector<std::shared_ptr<Material>> &GetMaterials() override;
|
||||
|
||||
@@ -18,7 +18,7 @@ public:
|
||||
void Render(ID3D11DeviceContext* devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, ID3D11DepthStencilView *depthStencilViewPtr, const Camera& camera) override;
|
||||
|
||||
private:
|
||||
std::vector<Mesh *> m_meshes{};
|
||||
std::vector<std::unique_ptr<Mesh>> m_meshes{};
|
||||
std::vector<std::shared_ptr<Material>> m_materials{};
|
||||
|
||||
std::vector<Mesh*> m_brokMeshses{ nullptr };
|
||||
|
||||
@@ -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<float>(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<Effect>(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<InstancedMesh>(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<Mesh *> &InstancedScene::GetMeshes() {
|
||||
std::vector<std::unique_ptr<Mesh>> &InstancedScene::GetMeshes() {
|
||||
return m_meshes;
|
||||
}
|
||||
|
||||
@@ -81,7 +77,7 @@ std::vector<std::shared_ptr<Material>> &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<float>(SDL_GetTicks());
|
||||
float YOffset = sin(static_cast<float>(x) * 0.5f + currentTick * 0.001f) + cos(static_cast<float>(y) * 0.5f + currentTick * 0.001f);
|
||||
YOffset += (static_cast<float>(x) * 0.1f + static_cast<float>(y) * 0.1f) * 0.1f;
|
||||
|
||||
data.worldMatrix = Matrix::CreateTranslation(x * scale, YOffset, y * scale);
|
||||
data.worldMatrix *= Matrix::CreateScale(0.5f, 0.5f, 0.5f);
|
||||
|
||||
@@ -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<Mesh *> &GetMeshes() override;
|
||||
std::vector<std::unique_ptr<Mesh>> &GetMeshes() override;
|
||||
|
||||
std::vector<std::shared_ptr<Material>> &GetMaterials() override;
|
||||
|
||||
@@ -24,9 +24,9 @@ private:
|
||||
|
||||
ID3D11DeviceContext* m_DeviceContextPtr{};
|
||||
|
||||
std::vector<Mesh*> m_meshes;
|
||||
std::vector<std::unique_ptr<Mesh>> m_meshes;
|
||||
//Kind of hack since InstancedMesh doesnt extend mesh
|
||||
std::vector<InstancedMesh*> m_instancedMeshes;
|
||||
std::vector<std::unique_ptr<InstancedMesh>> m_instancedMeshes;
|
||||
std::vector<std::shared_ptr<Material>> m_materials;
|
||||
|
||||
const siv::PerlinNoise::seed_type seed = 123456u;
|
||||
|
||||
@@ -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<Effect>(DevicePtr, L"resources/PosCol3D.fx");
|
||||
auto vehicleMesh = std::make_unique<Mesh>(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<Material> FireMaterial = std::make_shared<Material>();
|
||||
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<FireEffect>(DevicePtr, L"resources/Fire.fx");
|
||||
auto fireMesh = std::make_unique<Mesh>(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<Mesh *> &MainScene::GetMeshes() {
|
||||
std::vector<std::unique_ptr<Mesh>> &MainScene::GetMeshes() {
|
||||
return m_meshes;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
class MainScene : public BaseScene {
|
||||
class MainScene final : public BaseScene {
|
||||
public:
|
||||
void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override;
|
||||
|
||||
void Cleanup() override;
|
||||
|
||||
std::vector<Mesh *> &GetMeshes() override;
|
||||
std::vector<std::unique_ptr<Mesh>> &GetMeshes() override;
|
||||
|
||||
std::vector<std::shared_ptr<Material>> &GetMaterials() override;
|
||||
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
|
||||
private:
|
||||
|
||||
std::vector<Mesh*> m_meshes{};
|
||||
std::vector<std::unique_ptr<Mesh>> m_meshes{};
|
||||
std::vector<std::shared_ptr<Material>> m_materials{};
|
||||
|
||||
};
|
||||
|
||||
@@ -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<Effect>(DevicePtr, L"resources/InstancedSimpleDiffuse.fx");
|
||||
auto rockMesh = std::make_unique<InstancedMesh>(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<Material> planetMaterial = std::make_shared<Material>();
|
||||
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<Effect>(DevicePtr, L"resources/SimpleDiffuse.fx");
|
||||
auto planetMesh = std::make_unique<Mesh>(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<Material> skyboxMaterial = std::make_shared<Material>();
|
||||
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<Effect>(DevicePtr, L"resources/SimpleDiffuse.fx");
|
||||
auto skyBoxMesh = std::make_unique<Mesh>(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<Mesh *> &PlanetScene::GetMeshes() {
|
||||
std::vector<std::unique_ptr<Mesh>> &PlanetScene::GetMeshes() {
|
||||
return m_meshes;
|
||||
}
|
||||
|
||||
@@ -121,7 +118,7 @@ std::vector<std::shared_ptr<Material>> &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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Mesh *> &GetMeshes() override;
|
||||
std::vector<std::unique_ptr<Mesh>> &GetMeshes() override;
|
||||
|
||||
std::vector<std::shared_ptr<Material>> &GetMaterials() override;
|
||||
|
||||
@@ -24,13 +24,14 @@ private:
|
||||
|
||||
ID3D11DeviceContext* m_DeviceContextPtr{};
|
||||
|
||||
std::vector<Mesh*> m_meshes;
|
||||
std::vector<std::unique_ptr<Mesh>> m_meshes;
|
||||
//Kind of hack since InstancedMesh doesnt extend mesh
|
||||
std::vector<InstancedMesh*> m_instancedMeshes;
|
||||
std::vector<std::unique_ptr<InstancedMesh>> m_instancedMeshes;
|
||||
std::vector<InstancedData> m_InstancedData;
|
||||
std::vector<std::shared_ptr<Material>> m_materials;
|
||||
|
||||
Mesh* m_skyboxMesh;
|
||||
Mesh* m_planetMesh;
|
||||
|
||||
Camera* m_Camera;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user