Compare commits

..

6 Commits

Author SHA1 Message Date
75c719a66d Fix shadow again 2025-01-17 19:50:50 +01:00
1ee5dd4ad0 Add shadows 2025-01-17 18:16:29 +01:00
f413bf886b Add shadows, fi other stuff 2025-01-17 18:13:36 +01:00
12cbbb4dcb Controller optimize thingy 2025-01-15 02:05:56 +01:00
2448bf3872 Stupid Controller Fix :p 2025-01-14 21:07:28 +01:00
a3a6011e43 Unique Ptrs, Const correctness 2025-01-14 20:51:17 +01:00
59 changed files with 4637 additions and 4178 deletions

1
.gitignore vendored
View File

@@ -26,3 +26,4 @@ bld/
cmake-build-debug cmake-build-debug
cmake-build-release cmake-build-release
cmake-build-debug-visual-studio cmake-build-debug-visual-studio
cmake-**

View File

@@ -13,30 +13,37 @@ set(SOURCES
"src/Utils.cpp" "src/Utils.cpp"
"src/HitTest.cpp" "src/HitTest.cpp"
"src/Material.cpp" "src/Material.cpp"
"src/Light.cpp" "src/DirectionalLight.cpp"
"src/Math/Vector2.cpp" "src/Math/Vector2.cpp"
"src/Math/Vector3.cpp" "src/Math/Vector3.cpp"
"src/Math/Vector4.cpp" "src/Math/Vector4.cpp"
"src/Math/Matrix.cpp" "src/Math/Matrix.cpp"
"src/BRDF.h"
"src/Effects/Effect.cpp" "src/Effects/Effect.cpp"
"src/Effects/BaseEffect.cpp" "src/Effects/BaseEffect.cpp"
"src/Effects/FireEffect.cpp" "src/Effects/FireEffect.cpp"
"src/Effects/ShadowEffect.cpp" "src/Effects/ShadowEffect.cpp"
"src/Effects/ShadowDiffuse.cpp"
"src/Singleton.h"
"src/RenderSettings.h"
"src/PerlinNoise.hpp" "src/PerlinNoise.hpp"
"src/Buffers/DepthBuffer.cpp"
"src/Buffers/SamplerState.cpp"
"src/Buffers/ShadowMapBuffer.cpp"
"src/Scenes/BaseScene.cpp" "src/Scenes/BaseScene.cpp"
"src/Scenes/MainScene.cpp" "src/Scenes/MainScene.cpp"
"src/Scenes/DioramaScene.cpp" "src/Scenes/DioramaScene.cpp"
"src/Scenes/InstancedScene.cpp" "src/Scenes/InstancedScene.cpp"
"src/Scenes/PlanetScene.cpp" "src/Scenes/PlanetScene.cpp"
"src/Scenes/ShadowTestScene.cpp" "src/Scenes/ShadowTestScene.cpp"
"src/Buffers/ShadowMapBuffer.cpp"
"src/Buffers/SamplerState.cpp"
"src/Buffers/DepthBuffer.cpp"
"src/Buffers/DX11Viewport.cpp"
) )
SET(INCLUDE_DIRS SET(INCLUDE_DIRS

View File

@@ -1,2 +1,42 @@
# Blender 4.3.2 MTL File: 'None' # Blender 4.3.2 MTL File: 'None'
# www.blender.org # www.blender.org
newmtl Material.001
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800119 0.001607 0.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Material.002
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800149 0.000000 0.387990
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Material.003
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.003822 0.800111 0.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Material.004
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2

File diff suppressed because it is too large Load Diff

View File

@@ -116,10 +116,6 @@ float3 Shade(VS_OUTPUT input)
} }
float4 PS(VS_OUTPUT input) : SV_TARGET{ float4 PS(VS_OUTPUT input) : SV_TARGET{
//Check if gDiffuseMap sample has a valid value, otherwise render red
if (gDiffuseMap.Sample(gSampleState, input.TexCoord).a == 0.f)
return float4(1.f, 0.f, 0.f, 1.f);
return gDiffuseMap.Sample(gSampleState, input.TexCoord); return gDiffuseMap.Sample(gSampleState, input.TexCoord);
} }

View File

@@ -1,13 +1,6 @@
// Global parameters
SamplerState gShadowSampler : ShadowSampler;
SamplerState gShadowSampler2 : ShadowSampler {
Filter = MIN_MAG_MIP_POINT;
AddressU = CLAMP;
AddressV = CLAMP;
ComparisonFunc = LESS_EQUAL;
};
texture2D gShadowMap : ShadowMap; texture2D gShadowMap : ShadowMap;
float4x4 gLightViewProj : LightViewProjection; float4x4 gLightWorldViewProj : LightViewProjection;
DepthStencilState ShadowDepthStencilState DepthStencilState ShadowDepthStencilState
{ {
@@ -17,7 +10,16 @@ DepthStencilState ShadowDepthStencilState
StencilEnable = false; // We don't need stencil operations here StencilEnable = false; // We don't need stencil operations here
}; };
SamplerState gShadowSampler2 : ShadowSampler {
Filter = MIN_MAG_MIP_POINT;
AddressU = CLAMP;
AddressV = CLAMP;
ComparisonFunc = LESS_EQUAL;
};
SamplerState gSampleState : SampleState; SamplerState gSampleState : SampleState;
RasterizerState gRasterizerState : RastState; RasterizerState gRasterizerState : RastState;
float4x4 gWorldViewProj : WorldViewProjection; float4x4 gWorldViewProj : WorldViewProjection;
@@ -66,69 +68,89 @@ VS_OUTPUT VS(VS_INPUT input) {
// Calculate shadow map coordinates // Calculate shadow map coordinates
// lightSpaceMatrix * vec4(vs_out.FragPos, 1.0); // lightSpaceMatrix * vec4(vs_out.FragPos, 1.0);
output.ShadowCoord = mul(float4(input.Position, 1.f) , gLightViewProj); output.ShadowCoord = mul(float4(input.Position, 1.f) , gLightWorldViewProj);
return output; return output;
} }
// Shadow sampling function // Shadow sampling function
float ShadowCalculation(float4 shadowCoord) { float ShadowCalculation(float4 shadowCoord, float3 normal) {
// Normalize the depth by dividing by the w component // Normalize the depth by dividing by the w component
float3 projCoord = shadowCoord.xyz / shadowCoord.w; float3 projCoord = shadowCoord.xyz / shadowCoord.w;
float shadow = 0.0;
uint width, height;
gShadowMap.GetDimensions(width, height);
float2 texelSize = float2(1.f / width, 1.f / height);
// Convert from [-1, 1] to [0, 1] // Convert from [-1, 1] to [0, 1]
float2 UVCoords; float2 UVCoords;
UVCoords.x = 0.5f * projCoord.x + 0.5f; UVCoords.x = 0.5f * projCoord.x + 0.5f;
UVCoords.y = -0.5f * projCoord.y + 0.5f; UVCoords.y = -0.5f * projCoord.y + 0.5f;
// float z = 0.5 * projCoord.z + 0.5;
float z = projCoord.z; float z = projCoord.z;
// Sample the shadow map
float shadowDepth = gShadowMap.Sample(gShadowSampler2, UVCoords.xy).r;
float bias = 0.0025f; float bias = max(0.05 * (1.0 - dot(normal, -gLightDirection)), 0.005);
// float bias = max(0.05 * (1.0 - dot(normal, lightDir)), 0.005);
// return gShadowMap.Sample(gShadowSampler2, UVCoords.xy).r;
// Check if the current fragment is in shadow
if (shadowDepth + bias < z)
return 0.5f;
else
return 1.0f;
for(int x = -1; x <= 1; ++x)
{
for(int y = -1; y <= 1; ++y)
{
float pcfDepth = gShadowMap.Sample(gShadowSampler2, UVCoords.xy + float2(x, y) * texelSize).r;
shadow += z - bias > pcfDepth ? 1.0 : 0.0;
}
} }
shadow /= 9.0f;
if(projCoord.z > 1.0)
shadow = 0.0;
return shadow;
}
// Pixel shader // Pixel shader
// float4 PS(VS_OUTPUT input) : SV_TARGET {
// float shadowFactor = ShadowCalculation(input.ShadowCoord, input.Normal);
//
// float3 diffuseColor = gDiffuseMap.Sample(gSampleState, input.TexCoord).rgb;
//
// float3 finalColor = diffuseColor * (1 - shadowFactor);
// finalColor += gAmbient;
//
// return float4(finalColor, 1.0f);
// }
float4 PS(VS_OUTPUT input) : SV_TARGET { float4 PS(VS_OUTPUT input) : SV_TARGET {
// Check if gDiffuseMap sample has a valid value, otherwise render red float3 color = gDiffuseMap.Sample(gSampleState, input.TexCoord).rgb;
// if (gDiffuseMap.Sample(gSampleState, input.TexCoord).a == 0.f) float3 normal = normalize(input.Normal);
// return float4(1.f, 0.f, 0.f, 1.f);
// return float4(Shade(input), 1.0f); // Use the shading function with shadow float3 lightDir = normalize(-gLightDirection);
float3 viewDir = normalize(gCameraPosition - input.WorldPosition.xyz);
// return gShadowMap.Sample(gShadowSampler, input.ShadowCoord.xy / input.ShadowCoord.w); // Sample shadow map float3 ambient = gAmbient;
float shadowFactor = ShadowCalculation(input.ShadowCoord); float diff = max(dot(normal, lightDir), 0.0);
float3 diffuseColor = gDiffuseMap.Sample(gSampleState, input.TexCoord).rgb; float3 diffuse = gLightColor * diff * color;
float3 finalColor = float3(1.f, 1.f, 1.f) * shadowFactor; float3 reflectDir = reflect(-lightDir, normal);
finalColor += gAmbient; float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
float3 specular = gLightColor * spec;
float shadow = ShadowCalculation(input.ShadowCoord, normal);
float3 lighting = (ambient + (1.0 - shadow) * (diffuse + specular)) * color;
// return float4(shadowDepth,shadowDepth,shadowDepth, 1.0f); return float4(lighting, 1.0f);
return float4(finalColor, 1.0f);
// return gShadowMap.Sample(gShadowSampler, input.TexCoord); // Sample shadow map
} }
// DepthStencilState // DepthStencilState
DepthStencilState gDepthStencilState DepthStencilState gDepthStencilState {
{
DepthEnable = true; DepthEnable = true;
DepthWriteMask = ALL; DepthWriteMask = ALL;
DepthFunc = LESS; DepthFunc = LESS;
StencilEnable = true; StencilEnable = true;
}; };
// Technique // Technique
technique11 DefaultTechnique { technique11 DefaultTechnique {
pass P0 { pass P0 {

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

25
project/src/BRDF.h Normal file
View File

@@ -0,0 +1,25 @@
//
// Created by Bram on 17/01/2025.
//
#ifndef GP1_DIRECTX_BRDF_H
#define GP1_DIRECTX_BRDF_H
#include "ColorRGB.h"
#include "./math/Vector3.h"
namespace dae{
static ColorRGB Phong(const ColorRGB& specularReflectance, float exp, const Vector3& lightDir, const Vector3& viewDir, const Vector3& normal)
{
const Vector3 reflect{ Vector3::Reflect(lightDir, normal) };
const float dot{ Saturate(Vector3::Dot(reflect, -viewDir)) };
return specularReflectance * powf(dot, exp);
}
static ColorRGB Lambert(float kd, const ColorRGB& diffuse)
{
return kd * diffuse;
}
}
#endif //GP1_DIRECTX_BRDF_H

View File

@@ -3,3 +3,33 @@
// //
#include "DX11Viewport.h" #include "DX11Viewport.h"
DX11Viewport::DX11Viewport(float width, float height, float topLeftX, float topLeftY, float minDepth, float maxDepth) {
viewport.Width = width;
viewport.Height = height;
viewport.TopLeftX = topLeftX;
viewport.TopLeftY = topLeftY;
viewport.MinDepth = minDepth;
viewport.MaxDepth = maxDepth;
}
void DX11Viewport::Apply(ID3D11DeviceContext *context) {
if (context) {
context->RSSetViewports(1, &viewport);
}
}
void DX11Viewport::SetDimensions(float width, float height) {
viewport.Width = width;
viewport.Height = height;
}
void DX11Viewport::SetPosition(float topLeftX, float topLeftY) {
viewport.TopLeftX = topLeftX;
viewport.TopLeftY = topLeftY;
}
void DX11Viewport::SetDepthRange(float minDepth, float maxDepth) {
viewport.MinDepth = minDepth;
viewport.MaxDepth = maxDepth;
}

View File

@@ -3,44 +3,17 @@
#include <d3d11.h> #include <d3d11.h>
class DX11Viewport class DX11Viewport {
{
public: public:
DX11Viewport(float width, float height, float topLeftX = 0.0f, float topLeftY = 0.0f, float minDepth = 0.0f, float maxDepth = 1.0f) DX11Viewport(float width, float height, float topLeftX = 0.0f, float topLeftY = 0.0f, float minDepth = 0.0f, float maxDepth = 1.0f);
{
viewport.Width = width;
viewport.Height = height;
viewport.TopLeftX = topLeftX;
viewport.TopLeftY = topLeftY;
viewport.MinDepth = minDepth;
viewport.MaxDepth = maxDepth;
}
void Apply(ID3D11DeviceContext* context) void Apply(ID3D11DeviceContext *context);
{
if (context)
{
context->RSSetViewports(1, &viewport);
}
}
void SetDimensions(float width, float height) void SetDimensions(float width, float height);
{
viewport.Width = width;
viewport.Height = height;
}
void SetPosition(float topLeftX, float topLeftY) void SetPosition(float topLeftX, float topLeftY);
{
viewport.TopLeftX = topLeftX;
viewport.TopLeftY = topLeftY;
}
void SetDepthRange(float minDepth, float maxDepth) void SetDepthRange(float minDepth, float maxDepth);
{
viewport.MinDepth = minDepth;
viewport.MaxDepth = maxDepth;
}
const D3D11_VIEWPORT &GetViewport() const { return viewport; } const D3D11_VIEWPORT &GetViewport() const { return viewport; }

View File

@@ -1,18 +1,15 @@
#include "DepthBuffer.h" #include "DepthBuffer.h"
DepthBuffer::DepthBuffer(ID3D11Device *device, UINT width, UINT height) DepthBuffer::DepthBuffer(ID3D11Device *device, UINT width, UINT height)
: m_device(device), m_width(width), m_height(height), m_depthBuffer(nullptr), m_depthStencilView(nullptr) : m_device(device), m_width(width), m_height(height), m_depthBuffer(nullptr), m_depthStencilView(nullptr) {
{
} }
DepthBuffer::~DepthBuffer() DepthBuffer::~DepthBuffer() {
{
if (m_depthStencilView) m_depthStencilView->Release(); if (m_depthStencilView) m_depthStencilView->Release();
if (m_depthBuffer) m_depthBuffer->Release(); if (m_depthBuffer) m_depthBuffer->Release();
} }
bool DepthBuffer::Initialize() bool DepthBuffer::Initialize() {
{
// Create a depth buffer with a typeless format // Create a depth buffer with a typeless format
D3D11_TEXTURE2D_DESC desc = {}; D3D11_TEXTURE2D_DESC desc = {};
desc.Width = m_width; desc.Width = m_width;
@@ -27,8 +24,7 @@ bool DepthBuffer::Initialize()
desc.MiscFlags = 0; desc.MiscFlags = 0;
HRESULT hr = m_device->CreateTexture2D(&desc, nullptr, &m_depthBuffer); HRESULT hr = m_device->CreateTexture2D(&desc, nullptr, &m_depthBuffer);
if (FAILED(hr)) if (FAILED(hr)) {
{
return false; return false;
} }
@@ -38,20 +34,17 @@ bool DepthBuffer::Initialize()
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
dsvDesc.Texture2D.MipSlice = 0; dsvDesc.Texture2D.MipSlice = 0;
hr = m_device->CreateDepthStencilView(m_depthBuffer, &dsvDesc, &m_depthStencilView); hr = m_device->CreateDepthStencilView(m_depthBuffer, &dsvDesc, &m_depthStencilView);
if (FAILED(hr)) if (FAILED(hr)) {
{
return false; return false;
} }
return true; return true;
} }
ID3D11Texture2D* DepthBuffer::GetDepthBuffer() ID3D11Texture2D *DepthBuffer::GetDepthBuffer() {
{
return m_depthBuffer; return m_depthBuffer;
} }
ID3D11DepthStencilView* DepthBuffer::GetDepthStencilView() ID3D11DepthStencilView *DepthBuffer::GetDepthStencilView() {
{
return m_depthStencilView; return m_depthStencilView;
} }

View File

@@ -10,12 +10,12 @@ SamplerState::~SamplerState() {
bool SamplerState::Initialize() { bool SamplerState::Initialize() {
D3D11_SAMPLER_DESC samplerDesc = {}; D3D11_SAMPLER_DESC samplerDesc = {};
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
// samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
// samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
// samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; // samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; // samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; // samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL; samplerDesc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL;
samplerDesc.MinLOD = 0; samplerDesc.MinLOD = 0;
samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;

View File

@@ -8,7 +8,6 @@ ShadowMapBuffer::ShadowMapBuffer(ID3D11Device *device, UINT width, UINT height)
ShadowMapBuffer::~ShadowMapBuffer() { ShadowMapBuffer::~ShadowMapBuffer() {
if (m_shaderResourceView) m_shaderResourceView->Release(); if (m_shaderResourceView) m_shaderResourceView->Release();
} }
bool ShadowMapBuffer::Initialize() { bool ShadowMapBuffer::Initialize() {
if (!m_depthBuffer.Initialize()) { if (!m_depthBuffer.Initialize()) {
return false; return false;

View File

@@ -1,7 +1,3 @@
//
// Created by Bram on 13/01/2025.
//
#ifndef GP1_DIRECTX_SHADOWMAPBUFFER_H #ifndef GP1_DIRECTX_SHADOWMAPBUFFER_H
#define GP1_DIRECTX_SHADOWMAPBUFFER_H #define GP1_DIRECTX_SHADOWMAPBUFFER_H
@@ -22,7 +18,6 @@ public:
void ResetRenderTarget(ID3D11DeviceContext *deviceContext); void ResetRenderTarget(ID3D11DeviceContext *deviceContext);
// Get the depth stencil view and the sampler state
ID3D11ShaderResourceView *GetShaderResourceView() const { return m_shaderResourceView; } ID3D11ShaderResourceView *GetShaderResourceView() const { return m_shaderResourceView; }
ID3D11SamplerState *GetSamplerState() const { return m_samplerState.GetSamplerState(); } ID3D11SamplerState *GetSamplerState() const { return m_samplerState.GetSamplerState(); }

View File

@@ -60,9 +60,11 @@ void dae::Camera::Update(const dae::Timer *pTimer) {
if (pKeyboardState[SDL_SCANCODE_LSHIFT]) { if (pKeyboardState[SDL_SCANCODE_LSHIFT]) {
MovementSpeed *= 2; MovementSpeed *= 2;
} }
if (pKeyboardState[SDL_SCANCODE_W]) { if (pKeyboardState[SDL_SCANCODE_W]) {
origin += forward * deltaTime * MovementSpeed; origin += forward * deltaTime * MovementSpeed;
} }
if (pKeyboardState[SDL_SCANCODE_A]) { if (pKeyboardState[SDL_SCANCODE_A]) {
origin -= right * deltaTime * MovementSpeed; origin -= right * deltaTime * MovementSpeed;
} }
@@ -191,7 +193,7 @@ const dae::Vector3 & dae::Camera::GetPosition() const {
return origin; return origin;
} }
const dae::Vector3 dae::Camera::GetRotation() const { dae::Vector3 dae::Camera::GetRotation() const {
return {totalPitch, totalYaw, 0.f}; return {totalPitch, totalYaw, 0.f};
} }

View File

@@ -11,7 +11,7 @@
#include "Math/Matrix.h" #include "Math/Matrix.h"
namespace dae { namespace dae {
class Camera { class Camera final {
public: public:
Camera() = default; Camera() = default;
@@ -32,7 +32,7 @@ namespace dae {
const Vector3 & GetPosition() const; const Vector3 & GetPosition() const;
void SetPosition(const Vector3& position); void SetPosition(const Vector3& position);
const Vector3 GetRotation() const; Vector3 GetRotation() const;
void SetRotation(const Vector3& rotation); void SetRotation(const Vector3& rotation);
private: private:

View File

@@ -0,0 +1,53 @@
#include "DirectionalLight.h"
#include <cmath>
DirectionalLight::DirectionalLight()
: m_Position(0.0f, 10.0f, 0.0f),
m_Target(0.0f, 0.0f, 0.0f),
m_Up(0.0f, 1.0f, 0.0f),
m_ViewMatrix(dae::Matrix()),
m_ProjectionMatrix(dae::Matrix()) {}
void DirectionalLight::SetPosition(const dae::Vector3 &position) {
m_Position = position;
}
void DirectionalLight::SetTarget(const dae::Vector3 &target) {
m_Target = target;
}
void DirectionalLight::SetUp(const dae::Vector3 &up) {
m_Up = up;
}
dae::Matrix DirectionalLight::GetViewMatrix() const {
return dae::Matrix::CreateLookAtLH(m_Position, m_Target, m_Up);
}
dae::Matrix DirectionalLight::GetProjectionMatrix(float nearPlane, float farPlane, float size) const {
return dae::Matrix::CreateOrthographic(size, size, nearPlane, farPlane);
}
dae::Matrix DirectionalLight::GetViewProjectionMatrix(float nearPlane, float farPlane, float size) const {
return GetViewMatrix() * GetProjectionMatrix(nearPlane, farPlane, size);
}
void DirectionalLight::Update() {
// If the light position or target changes dynamically, this is where updates would be managed.
// m_ViewMatrix = dae::Matrix::CreateLookAtLH(m_Position, m_Target, m_Up);
// m_ProjectionMatrix = dae::Matrix::CreateOrthographic(size, size, nearPlane, farPlane);
}
dae::Vector3 DirectionalLight::GetTarget() {
return m_Target;
}
dae::Vector3 DirectionalLight::GetPosition() {
return m_Position;
}
void DirectionalLight::SetColor(const dae::ColorRGB &color) { m_Color = color; }
dae::Vector3 DirectionalLight::GetDirection() const { return m_Target - m_Position; }
dae::ColorRGB DirectionalLight::GetColor() const { return m_Color; }

View File

@@ -1,18 +1,20 @@
#ifndef GP1_DIRECTX_LIGHT_H #ifndef GP1_DIRECTX_DIRECTIONALLIGHT_H
#define GP1_DIRECTX_LIGHT_H #define GP1_DIRECTX_DIRECTIONALLIGHT_H
#include "Math/Vector3.h" #include "Math/Vector3.h"
#include "Math/Matrix.h" #include "Math/Matrix.h"
#include "ColorRGB.h"
class Light { class DirectionalLight {
public: public:
Light(); DirectionalLight();
~Light() = default; ~DirectionalLight() = default;
void SetPosition(const dae::Vector3 &position); void SetPosition(const dae::Vector3 &position);
void SetTarget(const dae::Vector3 &target); void SetTarget(const dae::Vector3 &target);
void SetUp(const dae::Vector3 &up); void SetUp(const dae::Vector3 &up);
void SetColor(const dae::ColorRGB &color);
dae::Matrix GetViewMatrix() const; dae::Matrix GetViewMatrix() const;
dae::Matrix GetProjectionMatrix(float nearPlane = 0.1f, float farPlane = 100.0f, float size = 50.0f) const; dae::Matrix GetProjectionMatrix(float nearPlane = 0.1f, float farPlane = 100.0f, float size = 50.0f) const;
@@ -22,13 +24,17 @@ public:
dae::Vector3 GetTarget(); dae::Vector3 GetTarget();
dae::Vector3 GetPosition(); dae::Vector3 GetPosition();
dae::Vector3 GetDirection() const;
dae::ColorRGB GetColor() const;
private: private:
dae::Vector3 m_Position; dae::Vector3 m_Position;
dae::Vector3 m_Target; dae::Vector3 m_Target;
dae::Vector3 m_Up; dae::Vector3 m_Up;
dae::ColorRGB m_Color{1.f, 1.f, 1.f};
dae::Matrix m_ViewMatrix; dae::Matrix m_ViewMatrix;
dae::Matrix m_ProjectionMatrix; dae::Matrix m_ProjectionMatrix;
}; };
#endif //GP1_DIRECTX_LIGHT_H #endif //GP1_DIRECTX_DIRECTIONALLIGHT_H

View File

@@ -9,10 +9,13 @@ BaseEffect::BaseEffect(ID3D11Device *devicePtr, const std::wstring &filePath) {
const std::ifstream file(filePath); const std::ifstream file(filePath);
if (!file) if (!file)
std::wcout << L"File doesn't exist" << std::endl; std::wcout << L"File doesn't exist" << std::endl;
m_EffectPtr = LoadEffect(devicePtr, filePath); m_EffectPtr = LoadEffect(devicePtr, filePath);
m_TechniquePtr = m_EffectPtr->GetTechniqueByName("DefaultTechnique"); m_TechniquePtr = m_EffectPtr->GetTechniqueByName("DefaultTechnique");
if (!m_TechniquePtr->IsValid()) if (!m_TechniquePtr->IsValid())
std::wcout << L"Technique is not valid" << std::endl; std::wcout << L"Technique is not valid" << std::endl;
m_MatWorldViewProjVariablePtr = m_EffectPtr->GetVariableByName("gWorldViewProj")->AsMatrix(); m_MatWorldViewProjVariablePtr = m_EffectPtr->GetVariableByName("gWorldViewProj")->AsMatrix();
if (!m_MatWorldViewProjVariablePtr->IsValid()) if (!m_MatWorldViewProjVariablePtr->IsValid())
std::wcout << L"gWorldViewProj Matrix is not valid" << std::endl; std::wcout << L"gWorldViewProj Matrix is not valid" << std::endl;
@@ -51,11 +54,11 @@ ID3DX11Effect *BaseEffect::LoadEffect(ID3D11Device *devicePtr, const std::wstrin
ss << errorsPtr[i]; ss << errorsPtr[i];
OutputDebugStringW(ss.str().c_str()); OutputDebugStringW(ss.str().c_str());
errorBlobPtr->Release(); errorBlobPtr->Release();
errorBlobPtr = nullptr; errorBlobPtr = nullptr;
return nullptr; return nullptr;
} else { } else {
std::wstringstream ss; std::wstringstream ss;
ss << "EffectLoader: Failed to CreateEffectFromFile!\nPath: " << filePath; ss << "EffectLoader: Failed to CreateEffectFromFile!\nPath: " << filePath;
std::wcout << ss.str() << std::endl; std::wcout << ss.str() << std::endl;
@@ -70,7 +73,6 @@ void BaseEffect::SetWorldViewProjMatrix(const dae::Matrix &matrix) {
} }
void BaseEffect::NextSamplingState() { void BaseEffect::NextSamplingState() {
} }
void BaseEffect::SetCameraPos(const dae::Vector3 &vector3) const { void BaseEffect::SetCameraPos(const dae::Vector3 &vector3) const {
@@ -78,6 +80,7 @@ void BaseEffect::SetCameraPos(const dae::Vector3 &vector3) const {
} }
void BaseEffect::SetMaterial(Material *material) { void BaseEffect::SetMaterial(Material *material) {
} }
void BaseEffect::SetWorldMatrix(const dae::Matrix& matrix) const { void BaseEffect::SetWorldMatrix(const dae::Matrix& matrix) const {

View File

@@ -1,7 +1,3 @@
//
// Created by Bram on 20/12/2024.
//
#ifndef GP1_DIRECTX_BASEEFFECT_H #ifndef GP1_DIRECTX_BASEEFFECT_H
#define GP1_DIRECTX_BASEEFFECT_H #define GP1_DIRECTX_BASEEFFECT_H
@@ -28,8 +24,6 @@ public:
ID3DX11EffectTechnique* GetTechniquePtr() const { return m_TechniquePtr; } ID3DX11EffectTechnique* GetTechniquePtr() const { return m_TechniquePtr; }
void SetWorldViewProjMatrix(const dae::Matrix& matrix); void SetWorldViewProjMatrix(const dae::Matrix& matrix);
virtual void NextSamplingState(); virtual void NextSamplingState();

View File

@@ -40,7 +40,6 @@ Effect::Effect(ID3D11Device *devicePtr, const std::wstring &filePath)
if(!m_CameraPosVariablePtr->IsValid()) if(!m_CameraPosVariablePtr->IsValid())
std::wcout << L"gCameraPos Vector is not valid" << std::endl; std::wcout << L"gCameraPos Vector is not valid" << std::endl;
m_LightColorVariablePtr = m_EffectPtr->GetVariableByName("gLightColor")->AsVector(); m_LightColorVariablePtr = m_EffectPtr->GetVariableByName("gLightColor")->AsVector();
if(!m_LightColorVariablePtr->IsValid()) if(!m_LightColorVariablePtr->IsValid())
std::wcout << L"gLightColor Vector is not valid" << std::endl; std::wcout << L"gLightColor Vector is not valid" << std::endl;
@@ -53,17 +52,6 @@ Effect::Effect(ID3D11Device *devicePtr, const std::wstring &filePath)
if(!m_RasterizerVariablePtr->IsValid()) if(!m_RasterizerVariablePtr->IsValid())
std::wcout << L"gRasterizerState Rasterizer is not valid" << std::endl; std::wcout << L"gRasterizerState Rasterizer is not valid" << std::endl;
m_ShadowMapVariablePtr = m_EffectPtr->GetVariableByName("gShadowMap")->AsShaderResource();
if(!m_ShadowMapVariablePtr->IsValid())
std::wcout << L"gShadowMap ShaderResource is not valid" << std::endl;
m_ShadowMapSamplerVariablePtr = m_EffectPtr->GetVariableByName("gShadowSampler")->AsSampler();
if(!m_ShadowMapSamplerVariablePtr->IsValid())
std::wcout << L"gShadowSampler Sampler is not valid" << std::endl;
m_LightWorldViewProjVariablePtr = m_EffectPtr->GetVariableByName("gLightViewProj")->AsMatrix();
if(!m_LightWorldViewProjVariablePtr->IsValid())
std::wcout << L"gLightWorldViewProj Matrix is not valid" << std::endl;
m_UseNormalMapVariablePtr->SetBool(m_UseNormalMap); m_UseNormalMapVariablePtr->SetBool(m_UseNormalMap);
@@ -78,7 +66,6 @@ Effect::Effect(ID3D11Device *devicePtr, const std::wstring &filePath)
this->InitSamplers(devicePtr); this->InitSamplers(devicePtr);
this->InitRasterizer(devicePtr); this->InitRasterizer(devicePtr);
m_SamplerVariablePtr->SetSampler(0,m_SamplerStates[static_cast<int>(m_TechniqueType)]); m_SamplerVariablePtr->SetSampler(0,m_SamplerStates[static_cast<int>(m_TechniqueType)]);
m_RasterizerVariablePtr->SetRasterizerState(0,m_RasterizerStates[static_cast<int>(m_CullMode)]); m_RasterizerVariablePtr->SetRasterizerState(0,m_RasterizerStates[static_cast<int>(m_CullMode)]);
} }
@@ -216,17 +203,3 @@ void Effect::InitRasterizer(ID3D11Device *devicePtr) {
devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast<int>(CullMode::None)]); devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast<int>(CullMode::None)]);
} }
void Effect::SetShadowMapSampler(ID3D11SamplerState *pState) {
m_ShadowMapSamplerVariablePtr->SetSampler(0,pState);
}
void Effect::SetShadowMap(ID3D11ShaderResourceView *pView) {
m_ShadowMapVariablePtr->SetResource(pView);
}
void Effect::SetLightViewProjMatrix(Matrix matrix) {
m_LightWorldViewProjVariablePtr->SetMatrix(reinterpret_cast<const float*>(&matrix));
}

View File

@@ -3,16 +3,13 @@
#include "BaseEffect.h" #include "BaseEffect.h"
#include <array> #include <array>
enum class CullMode { enum class CullMode {
None = 0, None = 0,
Front = 1, Front = 1,
Back = 2 Back = 2
}; };
class Effect final: public BaseEffect {
class Effect: public BaseEffect {
public: public:
Effect(ID3D11Device *devicePtr, const std::wstring &filePath); Effect(ID3D11Device *devicePtr, const std::wstring &filePath);
@@ -30,12 +27,6 @@ public:
void NextCullMode() override; void NextCullMode() override;
void SetShadowMap(ID3D11ShaderResourceView *pView);
void SetShadowMapSampler(ID3D11SamplerState *pState);
void SetLightViewProjMatrix(Matrix matrix);
private: private:
void InitSamplers(ID3D11Device* devicePtr); void InitSamplers(ID3D11Device* devicePtr);
@@ -58,13 +49,6 @@ private:
ID3DX11EffectRasterizerVariable* m_RasterizerVariablePtr{}; ID3DX11EffectRasterizerVariable* m_RasterizerVariablePtr{};
ID3DX11EffectShaderResourceVariable* m_ShadowMapVariablePtr{};
//m_LightWorldViewProjVariablePtr
ID3DX11EffectMatrixVariable* m_LightWorldViewProjVariablePtr{};
ID3DX11EffectSamplerVariable* m_ShadowMapSamplerVariablePtr{};
TechniqueType m_TechniqueType{TechniqueType::Linear}; TechniqueType m_TechniqueType{TechniqueType::Linear};
std::array<ID3D11SamplerState*, 3> m_SamplerStates{}; std::array<ID3D11SamplerState*, 3> m_SamplerStates{};

View File

@@ -9,7 +9,7 @@
#include <array> #include <array>
#include "BaseEffect.h" #include "BaseEffect.h"
class FireEffect: public BaseEffect { class FireEffect final : public BaseEffect {
public: public:
FireEffect(ID3D11Device *devicePtr, const std::wstring &filePath); FireEffect(ID3D11Device *devicePtr, const std::wstring &filePath);
@@ -22,7 +22,6 @@ public:
private: private:
void InitSamplers(ID3D11Device *devicePtr); void InitSamplers(ID3D11Device *devicePtr);
ID3DX11EffectShaderResourceVariable *m_DiffuseMapVariablePtr{}; ID3DX11EffectShaderResourceVariable *m_DiffuseMapVariablePtr{};
ID3DX11EffectSamplerVariable *m_SamplerVariablePtr{}; ID3DX11EffectSamplerVariable *m_SamplerVariablePtr{};

View File

@@ -0,0 +1,247 @@
#include "../pch.h"
#include "ShadowDiffuse.h"
#include "../Utils.h"
#include <fstream>
ShadowDiffuse::ShadowDiffuse(ID3D11Device *devicePtr, const std::wstring &filePath)
: BaseEffect(devicePtr, filePath) {
m_LightPosVariablePtr = m_EffectPtr->GetVariableByName("gLightDirection")->AsVector();
if (!m_LightPosVariablePtr->IsValid())
std::wcout << L"gLightDirection Vector is not valid" << std::endl;
m_SamplerVariablePtr = m_EffectPtr->GetVariableByName("gSampleState")->AsSampler();
if (!m_SamplerVariablePtr->IsValid())
std::wcout << L"gSampleState Sampler is not valid" << std::endl;
m_MatWorldVariablePtr = m_EffectPtr->GetVariableByName("gWorldMatrix")->AsMatrix();
if (!m_MatWorldVariablePtr->IsValid())
std::wcout << L"gWorld Matrix is not valid" << std::endl;
m_DiffuseMapVariablePtr = m_EffectPtr->GetVariableByName("gDiffuseMap")->AsShaderResource();
if (!m_DiffuseMapVariablePtr->IsValid())
std::wcout << L"gDiffuseMap ShaderResource is not valid" << std::endl;
m_NormalMapVariablePtr = m_EffectPtr->GetVariableByName("gNormalMap")->AsShaderResource();
if (!m_NormalMapVariablePtr->IsValid())
std::wcout << L"gNormalMap ShaderResource is not valid" << std::endl;
m_SpecularMapVariablePtr = m_EffectPtr->GetVariableByName("gSpecularMap")->AsShaderResource();
if (!m_SpecularMapVariablePtr->IsValid())
std::wcout << L"gSpecularMap ShaderResource is not valid" << std::endl;
m_GlossMapVariablePtr = m_EffectPtr->GetVariableByName("gGlossMap")->AsShaderResource();
if (!m_GlossMapVariablePtr->IsValid())
std::wcout << L"gGlossMap ShaderResource is not valid" << std::endl;
m_CameraPosVariablePtr = m_EffectPtr->GetVariableByName("gCameraPosition")->AsVector();
if (!m_CameraPosVariablePtr->IsValid())
std::wcout << L"gCameraPos Vector is not valid" << std::endl;
m_LightColorVariablePtr = m_EffectPtr->GetVariableByName("gLightColor")->AsVector();
if (!m_LightColorVariablePtr->IsValid())
std::wcout << L"gLightColor Vector is not valid" << std::endl;
m_UseNormalMapVariablePtr = m_EffectPtr->GetVariableByName("gUseNormal")->AsScalar();
if (!m_UseNormalMapVariablePtr->IsValid())
std::wcout << L"gUseNormalMap Scalar is not valid" << std::endl;
m_RasterizerVariablePtr = m_EffectPtr->GetVariableByName("gRasterizerState")->AsRasterizer();
if (!m_RasterizerVariablePtr->IsValid())
std::wcout << L"gRasterizerState Rasterizer is not valid" << std::endl;
m_ShadowMapVariablePtr = m_EffectPtr->GetVariableByName("gShadowMap")->AsShaderResource();
if (!m_ShadowMapVariablePtr->IsValid())
std::wcout << L"gShadowMapSampler Sampler is not valid" << std::endl;
m_LightWorldViewProjVariablePtr = m_EffectPtr->GetVariableByName("gLightWorldViewProj")->AsMatrix();
if (!m_LightWorldViewProjVariablePtr->IsValid())
std::wcout << L"gLightWorldViewProj Matrix is not valid" << std::endl;
m_LightDirectionVariablePtr = m_EffectPtr->GetVariableByName("gLightDirection")->AsVector();
if (!m_LightDirectionVariablePtr->IsValid())
std::wcout << L"gLightDirection Vector is not valid" << std::endl;
m_LightColorVariablePtr = m_EffectPtr->GetVariableByName("gLightColor")->AsVector();
if (!m_LightColorVariablePtr->IsValid())
std::wcout << L"gLightColor Vector is not valid" << std::endl;
m_UseNormalMapVariablePtr->SetBool(m_UseNormalMap);
constexpr int vectorSize{4};
constexpr float lightDirection[vectorSize]{.577f, -.577f, .577f, 0.f};
m_LightPosVariablePtr->SetFloatVector(lightDirection);
constexpr float lightColor[vectorSize]{1.f, 1.f, 1.f, 1.f};
m_LightColorVariablePtr->SetFloatVector(lightColor);
this->InitSamplers(devicePtr);
this->InitRasterizer(devicePtr);
m_SamplerVariablePtr->SetSampler(0, m_SamplerStates[static_cast<int>(m_TechniqueType)]);
m_RasterizerVariablePtr->SetRasterizerState(0, m_RasterizerStates[static_cast<int>(m_CullMode)]);
}
ShadowDiffuse::~ShadowDiffuse() {
m_MatWorldVariablePtr->Release();
m_MatWorldVariablePtr = nullptr;
m_DiffuseMapVariablePtr->Release();
m_DiffuseMapVariablePtr = nullptr;
m_NormalMapVariablePtr->Release();
m_NormalMapVariablePtr = nullptr;
m_SpecularMapVariablePtr->Release();
m_SpecularMapVariablePtr = nullptr;
m_GlossMapVariablePtr->Release();
m_GlossMapVariablePtr = nullptr;
m_CameraPosVariablePtr->Release();
m_CameraPosVariablePtr = nullptr;
m_LightPosVariablePtr->Release();
m_LightPosVariablePtr = nullptr;
m_LightColorVariablePtr->Release();
m_LightColorVariablePtr = nullptr;
m_UseNormalMapVariablePtr->Release();
m_UseNormalMapVariablePtr = nullptr;
m_SamplerVariablePtr->Release();
m_SamplerVariablePtr = nullptr;
m_RasterizerVariablePtr->Release();
m_RasterizerVariablePtr = nullptr;
m_LightDirectionVariablePtr->Release();
m_LightDirectionVariablePtr = nullptr;
if (m_ShadowMapVariablePtr) {
m_ShadowMapVariablePtr->Release();
m_ShadowMapVariablePtr = nullptr;
}
if (m_LightWorldViewProjVariablePtr) {
m_LightWorldViewProjVariablePtr->Release();
m_LightWorldViewProjVariablePtr = nullptr;
}
for (auto sampler: m_SamplerStates) {
sampler->Release();
}
for (auto rasterizer: m_RasterizerStates) {
rasterizer->Release();
}
m_EffectPtr->Release();
m_EffectPtr = nullptr;
}
void ShadowDiffuse::SetWorldMatrix(const dae::Matrix &world) const {
m_MatWorldVariablePtr->SetMatrix(reinterpret_cast<const float *>(&world));
}
void ShadowDiffuse::SetMaterial(Material *material) {
if (material->diffuseTexturePtr)
m_DiffuseMapVariablePtr->SetResource(material->diffuseTexturePtr->GetSrv());
if (material->normalTexturePtr)
m_NormalMapVariablePtr->SetResource(material->normalTexturePtr->GetSrv());
if (material->specularTexturePtr)
m_SpecularMapVariablePtr->SetResource(material->specularTexturePtr->GetSrv());
if (material->glossTexturePtr)
m_GlossMapVariablePtr->SetResource(material->glossTexturePtr->GetSrv());
}
void ShadowDiffuse::SetCameraPos(const dae::Vector3 &pos) const {
m_CameraPosVariablePtr->SetFloatVector(reinterpret_cast<const float *>(&pos));
}
void ShadowDiffuse::NextSamplingState() {
switch (m_TechniqueType) {
case TechniqueType::Point:
m_TechniqueType = TechniqueType::Linear;
break;
case TechniqueType::Linear:
m_TechniqueType = TechniqueType::Anisotropic;
break;
case TechniqueType::Anisotropic:
m_TechniqueType = TechniqueType::Point;
break;
}
m_SamplerVariablePtr->SetSampler(0, m_SamplerStates[static_cast<int>(m_TechniqueType)]);
}
void ShadowDiffuse::ToggleNormals() {
m_UseNormalMap = !m_UseNormalMap;
m_UseNormalMapVariablePtr->SetBool(m_UseNormalMap);
}
void ShadowDiffuse::InitSamplers(ID3D11Device *devicePtr) {
D3D11_SAMPLER_DESC samplerDesc{};
samplerDesc.Filter = D3D11_FILTER_ANISOTROPIC;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
devicePtr->CreateSamplerState(&samplerDesc, &m_SamplerStates[static_cast<int>(TechniqueType::Anisotropic)]);
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
devicePtr->CreateSamplerState(&samplerDesc, &m_SamplerStates[static_cast<int>(TechniqueType::Linear)]);
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
devicePtr->CreateSamplerState(&samplerDesc, &m_SamplerStates[static_cast<int>(TechniqueType::Point)]);
m_SamplerVariablePtr->SetSampler(0, m_SamplerStates[static_cast<int>(m_TechniqueType)]);
}
void ShadowDiffuse::NextCullMode() {
m_CullMode = static_cast<CullMode>((static_cast<int>(m_CullMode) + 1) % 3);
m_RasterizerVariablePtr->SetRasterizerState(0, m_RasterizerStates[static_cast<int>(m_CullMode)]);
}
void ShadowDiffuse::InitRasterizer(ID3D11Device *devicePtr) {
D3D11_RASTERIZER_DESC rasterDesc = {};
rasterDesc.FillMode = D3D11_FILL_SOLID; // Solid fill
rasterDesc.FrontCounterClockwise = FALSE;
rasterDesc.DepthBias = D3D11_DEFAULT_DEPTH_BIAS;
rasterDesc.SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
rasterDesc.DepthClipEnable = TRUE;
rasterDesc.ScissorEnable = FALSE;
rasterDesc.MultisampleEnable = FALSE;
rasterDesc.AntialiasedLineEnable = FALSE;
rasterDesc.CullMode = D3D11_CULL_BACK; // Cull back faces
devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast<int>(CullMode::Back)]);
rasterDesc.CullMode = D3D11_CULL_FRONT;
devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast<int>(CullMode::Front)]);
rasterDesc.CullMode = D3D11_CULL_NONE;
devicePtr->CreateRasterizerState(&rasterDesc, &m_RasterizerStates[static_cast<int>(CullMode::None)]);
}
void ShadowDiffuse::SetShadowMap(ID3D11ShaderResourceView *shadowMapSRV) {
m_ShadowMapVariablePtr->SetResource(shadowMapSRV);
}
void ShadowDiffuse::SetLightViewProjMatrix(Matrix matrix) {
m_LightWorldViewProjVariablePtr->SetMatrix(reinterpret_cast<const float *>(&matrix));
}
void ShadowDiffuse::SetLightDirection(Vector3 direction) {
m_LightDirectionVariablePtr->SetFloatVector(reinterpret_cast<const float *>(&direction));
}
void ShadowDiffuse::SetLightColor(ColorRGB rgb) {
m_LightColorVariablePtr->SetFloatVector(reinterpret_cast<const float *>(&rgb));
}

View File

@@ -0,0 +1,67 @@
#pragma once
#include "BaseEffect.h"
#include "Effect.h"
#include <array>
class ShadowDiffuse final: public BaseEffect {
public:
ShadowDiffuse(ID3D11Device *devicePtr, const std::wstring &filePath);
virtual ~ShadowDiffuse() override;
void SetWorldMatrix(const dae::Matrix &world) const override;
void SetCameraPos(const dae::Vector3 &pos) const override;
void SetMaterial(Material *material) override;
void ToggleNormals() override;
void NextSamplingState() override;
void NextCullMode() override;
void SetShadowMap(ID3D11ShaderResourceView* shadowMapSRV);
void SetLightViewProjMatrix(Matrix matrix);
void SetLightDirection(Vector3 direction);
void SetLightColor(ColorRGB rgb);
private:
void InitSamplers(ID3D11Device* devicePtr);
void InitRasterizer(ID3D11Device* devicePtr);
ID3DX11EffectMatrixVariable *m_MatWorldVariablePtr{};
ID3DX11EffectShaderResourceVariable *m_DiffuseMapVariablePtr{};
ID3DX11EffectShaderResourceVariable *m_NormalMapVariablePtr{};
ID3DX11EffectShaderResourceVariable *m_SpecularMapVariablePtr{};
ID3DX11EffectShaderResourceVariable *m_GlossMapVariablePtr{};
ID3DX11EffectVectorVariable *m_CameraPosVariablePtr{};
ID3DX11EffectVectorVariable *m_LightPosVariablePtr{};
ID3DX11EffectVectorVariable *m_LightColorVariablePtr{};
ID3DX11EffectVectorVariable *m_LightDirectionVariablePtr{};
ID3DX11EffectScalarVariable *m_UseNormalMapVariablePtr{};
ID3DX11EffectSamplerVariable *m_SamplerVariablePtr{};
ID3DX11EffectRasterizerVariable* m_RasterizerVariablePtr{};
ID3DX11EffectMatrixVariable* m_LightWorldViewProjVariablePtr{};
ID3DX11EffectShaderResourceVariable* m_ShadowMapVariablePtr{};
TechniqueType m_TechniqueType{TechniqueType::Linear};
std::array<ID3D11SamplerState*, 3> m_SamplerStates{};
std::array<ID3D11RasterizerState*, 3> m_RasterizerStates{};
CullMode m_CullMode{ CullMode::Back };
bool m_UseNormalMap{true};
};

View File

@@ -42,3 +42,23 @@ void ShadowEffect::SetShadowMapSampler(ID3D11SamplerState *samplerState) {
} }
} }
ShadowEffect::~ShadowEffect() {
if (m_LightWorldViewProjVariable) {
m_LightWorldViewProjVariable->Release();
m_LightWorldViewProjVariable = nullptr;
}
if (m_ShadowMapVariable) {
m_ShadowMapVariable->Release();
m_ShadowMapVariable = nullptr;
}
if (m_ShadowMapSamplerVariable) {
m_ShadowMapSamplerVariable->Release();
m_ShadowMapSamplerVariable = nullptr;
}
m_EffectPtr->Release();
m_EffectPtr = nullptr;
}

View File

@@ -8,12 +8,10 @@ class ShadowEffect : public BaseEffect {
public: public:
ShadowEffect(ID3D11Device* devicePtr, const std::wstring& filePath); ShadowEffect(ID3D11Device* devicePtr, const std::wstring& filePath);
~ShadowEffect() override = default; ~ShadowEffect() override;
void SetLightWorldViewProjMatrix(const dae::Matrix& matrix); void SetLightWorldViewProjMatrix(const dae::Matrix& matrix);
void SetShadowMap(ID3D11ShaderResourceView* shadowMapSRV); void SetShadowMap(ID3D11ShaderResourceView* shadowMapSRV);
void SetShadowMapSampler(ID3D11SamplerState* samplerState); void SetShadowMapSampler(ID3D11SamplerState* samplerState);
private: private:

View File

@@ -2,16 +2,17 @@
#define GP1_DIRECTX_GAMEPADCONTROLLER_H #define GP1_DIRECTX_GAMEPADCONTROLLER_H
#include <vector> #include <vector>
#include <array>
#include "SDL_gamecontroller.h" #include "SDL_gamecontroller.h"
#include "SDL.h" #include "SDL.h"
struct GamePad{ struct GamePad{
bool buttons[SDL_CONTROLLER_BUTTON_MAX]; std::array<bool, SDL_CONTROLLER_BUTTON_MAX> buttons{false};
float axis[SDL_CONTROLLER_AXIS_MAX]; std::array<float, SDL_CONTROLLER_AXIS_MAX> axis{0.0f};
bool prevButtons[SDL_CONTROLLER_BUTTON_MAX]{ false }; std::array<bool, SDL_CONTROLLER_BUTTON_MAX> prevButtons{ false };
}; };
enum class GamePadButton { enum class GamePadButton {
@@ -42,7 +43,7 @@ enum class GamePadButton {
enum Controllers {PLAYER1, PLAYER2, PLAYER3, PLAYER4}; enum Controllers {PLAYER1, PLAYER2, PLAYER3, PLAYER4};
class GamePadController { class GamePadController final {
public: public:
static GamePadController& GetInstance() static GamePadController& GetInstance()
@@ -66,7 +67,6 @@ private:
GamePadController(); GamePadController();
std::vector<SDL_GameController*> m_pGameControllers; std::vector<SDL_GameController*> m_pGameControllers;
std::vector<GamePad> m_GamePads; std::vector<GamePad> m_GamePads;
}; };

View File

@@ -1,7 +1,5 @@
#include "HitTest.h" #include "HitTest.h"
float CrossZ(const Vector3& p0, const Vector3& p1, const Vector3& point) float CrossZ(const Vector3& p0, const Vector3& p1, const Vector3& point)
{ {
return (p1.x - p0.x) * (point.y - p0.y) return (p1.x - p0.x) * (point.y - p0.y)
@@ -70,4 +68,3 @@ std::optional<Sample> TriangleHitTest(const Vector3& fragPos, const VertexOut& v
.mesh = v0.mesh .mesh = v0.mesh
}; };
} }

View File

@@ -7,11 +7,12 @@
#include "Math/Vector3.h" #include "Math/Vector3.h"
#include "Math/Vector2.h" #include "Math/Vector2.h"
#include "Mesh.h" #include "Mesh.h"
#include "Effects/Effect.h"
using namespace dae; using namespace dae;
struct Sample struct Sample final
{ {
Vector2 uv{}; Vector2 uv{};
Vector3 normal{}; Vector3 normal{};

View File

@@ -2,8 +2,8 @@
#include "InstancedMesh.h" #include "InstancedMesh.h"
InstancedMesh::InstancedMesh(ID3D11Device *devicePtr, const std::vector<VertexIn> &verticesIn, const std::vector<Uint32> &indices, InstancedMesh::InstancedMesh(ID3D11Device *devicePtr, const std::vector<VertexIn> &verticesIn, const std::vector<Uint32> &indices,
std::shared_ptr<Material> material, BaseEffect *effectPtr, const std::vector<InstancedData> &instanceData) std::shared_ptr<Material> material, std::unique_ptr<BaseEffect> effectPtr, const std::vector<InstancedData> &instanceData)
: m_EffectPtr(effectPtr), : m_EffectPtr(std::move(effectPtr)),
m_InputLayoutPtr(nullptr), m_InputLayoutPtr(nullptr),
m_VertexBufferPtr(nullptr), m_VertexBufferPtr(nullptr),
m_IndexBufferPtr(nullptr), m_IndexBufferPtr(nullptr),
@@ -152,9 +152,6 @@ InstancedMesh::~InstancedMesh() {
m_InstanceBufferPtr = nullptr; m_InstanceBufferPtr = nullptr;
} }
delete m_EffectPtr;
m_EffectPtr = nullptr;
m_Material.reset(); m_Material.reset();
m_InstancedData.clear(); m_InstancedData.clear();

View File

@@ -13,10 +13,10 @@ struct alignas(16) InstancedData {
Vector4 color; Vector4 color;
}; };
class InstancedMesh { class InstancedMesh final {
public: public:
InstancedMesh(ID3D11Device *devicePtr, const std::vector<VertexIn> &verticesIn, const std::vector<Uint32> &indices, InstancedMesh(ID3D11Device *devicePtr, const std::vector<VertexIn> &verticesIn, const std::vector<Uint32> &indices,
std::shared_ptr<Material> material, BaseEffect* effectPtr, const std::vector<InstancedData>& instanceData); std::shared_ptr<Material> material, std::unique_ptr<BaseEffect> effectPtr, const std::vector<InstancedData>& instanceData);
~InstancedMesh(); ~InstancedMesh();
@@ -26,7 +26,6 @@ public:
Matrix GetWorldMatrix() const; Matrix GetWorldMatrix() const;
Material* GetMaterial() const; Material* GetMaterial() const;
void SetWorldMatrix(const Matrix &matrix); void SetWorldMatrix(const Matrix &matrix);
@@ -40,7 +39,7 @@ public:
void UpdateInstanceData(ID3D11DeviceContext* deviceContextPtr, const std::vector<InstancedData>& instanceData); void UpdateInstanceData(ID3D11DeviceContext* deviceContextPtr, const std::vector<InstancedData>& instanceData);
private: private:
BaseEffect *m_EffectPtr; std::unique_ptr<BaseEffect> m_EffectPtr;
Matrix m_WorldMatrix{}; Matrix m_WorldMatrix{};

View File

@@ -1,45 +0,0 @@
#include "Light.h"
#include <cmath>
Light::Light()
: m_Position(0.0f, 10.0f, 0.0f),
m_Target(0.0f, 0.0f, 0.0f),
m_Up(0.0f, 1.0f, 0.0f),
m_ViewMatrix(dae::Matrix()),
m_ProjectionMatrix(dae::Matrix()) {}
void Light::SetPosition(const dae::Vector3 &position) {
m_Position = position;
}
void Light::SetTarget(const dae::Vector3 &target) {
m_Target = target;
}
void Light::SetUp(const dae::Vector3 &up) {
m_Up = up;
}
dae::Matrix Light::GetViewMatrix() const {
return dae::Matrix::CreateLookAtLH(m_Position, m_Target, m_Up);
}
dae::Matrix Light::GetProjectionMatrix(float nearPlane, float farPlane, float size) const {
return dae::Matrix::CreateOrthographic(size, size, nearPlane, farPlane);
}
dae::Matrix Light::GetViewProjectionMatrix(float nearPlane, float farPlane, float size) const {
return GetViewMatrix() * GetProjectionMatrix(nearPlane, farPlane, size);
}
void Light::Update() {
// If the light position or target changes dynamically, this is where updates would be managed.
// m_ViewMatrix = dae::Matrix::CreateLookAtLH(m_Position, m_Target, m_Up);
// m_ProjectionMatrix = dae::Matrix::CreateOrthographic(size, size, nearPlane, farPlane);
}
dae::Vector3 Light::GetTarget() {
return m_Target;
}
dae::Vector3 Light::GetPosition() {
return m_Position;
}

View File

@@ -3,7 +3,7 @@
#include "Texture.h" #include "Texture.h"
struct Material { struct Material final {
Texture *diffuseTexturePtr{nullptr}; Texture *diffuseTexturePtr{nullptr};
Texture *normalTexturePtr{nullptr}; Texture *normalTexturePtr{nullptr};
Texture *specularTexturePtr{nullptr}; Texture *specularTexturePtr{nullptr};

View File

@@ -282,7 +282,6 @@ namespace dae {
return result; return result;
} }
const Matrix& Matrix::operator*=(const Matrix& m) const Matrix& Matrix::operator*=(const Matrix& m)
{ {
Matrix copy{ *this }; Matrix copy{ *this };
@@ -303,12 +302,12 @@ namespace dae {
data[3] = {vector3, 1}; data[3] = {vector3, 1};
} }
Matrix Matrix::CreateOrthographic(float size, float size1, float nearPlane, float farPlane) { Matrix Matrix::CreateOrthographic(float width, float height, float zn, float zf) {
return Matrix( return Matrix(
{2.f / size, 0, 0, 0}, {2.f / width, 0, 0, 0},
{0, 2.f / size1, 0, 0}, {0, 2.f / height, 0, 0},
{0, 0, 1.f / (farPlane - nearPlane), 0}, {0, 0, 1.f / (zf - zn), 0},
{0, 0, -nearPlane / (farPlane - nearPlane), 1} {0, 0, -zn / (zf - zn), 1}
); );
} }

View File

@@ -50,9 +50,7 @@ namespace dae {
static Matrix CreateLookAtLH(const Vector3& origin, const Vector3& forward, const Vector3& up); static Matrix CreateLookAtLH(const Vector3& origin, const Vector3& forward, const Vector3& up);
static Matrix CreatePerspectiveFovLH(float fovy, float aspect, float zn, float zf); static Matrix CreatePerspectiveFovLH(float fovy, float aspect, float zn, float zf);
static Matrix CreateOrthographic(float width, float height, float zn, float zf);
Vector4& operator[](int index); Vector4& operator[](int index);
Vector4 operator[](int index) const; Vector4 operator[](int index) const;
Matrix operator*(const Matrix& m) const; Matrix operator*(const Matrix& m) const;
@@ -60,8 +58,6 @@ namespace dae {
void SetTranslation(Vector3 vector3); void SetTranslation(Vector3 vector3);
static dae::Matrix CreateOrthographic(float size, float size1, float plane, float plane1);
private: private:
//Row-Major Matrix //Row-Major Matrix

View File

@@ -5,8 +5,8 @@
#include "Effects/Effect.h" #include "Effects/Effect.h"
Mesh::Mesh(ID3D11Device *devicePtr, const std::vector<VertexIn> &verticesIn, const std::vector<Uint32> &indices, std::shared_ptr<Material> material, BaseEffect* effectPtr) : Mesh::Mesh(ID3D11Device *devicePtr, const std::vector<VertexIn> &verticesIn, const std::vector<Uint32> &indices, std::shared_ptr<Material> material, std::unique_ptr<BaseEffect> effectPtr) :
m_EffectPtr(effectPtr), m_EffectPtr(std::move(effectPtr)),
m_InputLayoutPtr(nullptr), m_InputLayoutPtr(nullptr),
m_VertexBufferPtr(nullptr), m_VertexBufferPtr(nullptr),
m_IndexBufferPtr(nullptr), m_IndexBufferPtr(nullptr),
@@ -91,8 +91,6 @@ Mesh::~Mesh() {
m_IndexBufferPtr->Release(); m_IndexBufferPtr->Release();
m_IndexBufferPtr = nullptr; m_IndexBufferPtr = nullptr;
delete m_EffectPtr;
m_EffectPtr = nullptr;
} }
void Mesh::Render(ID3D11DeviceContext *deviceContextPtr, const Matrix &worldViewProj) const { void Mesh::Render(ID3D11DeviceContext *deviceContextPtr, const Matrix &worldViewProj) const {
@@ -141,7 +139,3 @@ void Mesh::SetMaterial(Material *pMaterial) {
void Mesh::CycleCullMode() { void Mesh::CycleCullMode() {
m_EffectPtr->NextCullMode(); m_EffectPtr->NextCullMode();
} }
BaseEffect *Mesh::GetEffect() {
return m_EffectPtr;
}

View File

@@ -19,12 +19,10 @@ enum class PrimitiveTopology {
}; };
class Mesh final {
class Mesh {
public: public:
Mesh(ID3D11Device *devicePtr, const std::vector<VertexIn> &verticesIn, const std::vector<Uint32> &indices, Mesh(ID3D11Device *devicePtr, const std::vector<VertexIn> &verticesIn, const std::vector<Uint32> &indices,
std::shared_ptr<Material> material, BaseEffect* effectPtr); std::shared_ptr<Material> material, std::unique_ptr<BaseEffect> effectPtr);
~Mesh(); ~Mesh();
@@ -53,10 +51,8 @@ public:
void SetShouldRender(bool shouldRender) { m_ShouldRender = shouldRender; } void SetShouldRender(bool shouldRender) { m_ShouldRender = shouldRender; }
bool GetShouldRender() const { return m_ShouldRender; } bool GetShouldRender() const { return m_ShouldRender; }
BaseEffect *GetEffect();
private: private:
BaseEffect *m_EffectPtr; std::unique_ptr<BaseEffect> m_EffectPtr;
Matrix m_WorldMatrix{}; Matrix m_WorldMatrix{};

View File

@@ -0,0 +1,26 @@
//
// Created by Bram on 16/01/2025.
//
#ifndef GP1_DIRECTX_RENDERSETTINGS_H
#define GP1_DIRECTX_RENDERSETTINGS_H
#include "Singleton.h"
class RenderSettings : public Singleton<RenderSettings> {
public:
void setWidth(int w) { width = w; }
void setHeight(int h) { height = h; }
int getWidth() const { return width; }
int getHeight() const { return height; }
private:
friend class Singleton<RenderSettings>;
RenderSettings() : width(1920), height(1080) {} // Default values
int width;
int height;
};
#endif //GP1_DIRECTX_RENDERSETTINGS_H

View File

@@ -4,13 +4,13 @@
#include "Utils.h" #include "Utils.h"
#include "Texture.h" #include "Texture.h"
#include "Effects/Effect.h" #include "Effects/Effect.h"
#include "Effects/FireEffect.h"
#include "HitTest.h" #include "HitTest.h"
#include "Scenes/MainScene.h" #include "Scenes/MainScene.h"
#include "Scenes/DioramaScene.h" #include "Scenes/DioramaScene.h"
#include "Scenes/InstancedScene.h" #include "Scenes/InstancedScene.h"
#include "Scenes/PlanetScene.h" #include "Scenes/PlanetScene.h"
#include "Scenes/ShadowTestScene.h" #include "Scenes/ShadowTestScene.h"
#include "BRDF.h"
namespace dae { namespace dae {
@@ -37,14 +37,14 @@ namespace dae {
InitializeSDLRasterizer(); InitializeSDLRasterizer();
m_pScene = new ShadowTestScene(); m_pScene = std::make_unique<ShadowTestScene>();
m_pScene->Initialize(m_DevicePtr, m_DeviceContextPtr, nullptr); m_pScene->Initialize(m_DevicePtr, m_DeviceContextPtr, nullptr);
if (!m_pScene->GetMeshes().empty()) { if (!m_pScene->GetMeshes().empty()) {
m_pFireMesh = m_pScene->GetMeshes().back(); m_pFireMesh = m_pScene->GetMeshes().back().get();
} }
float aspectRatio = static_cast<float>(m_Width) / static_cast<float>(m_Height); const float aspectRatio = static_cast<float>(m_Width) / static_cast<float>(m_Height);
m_Camera = Camera({.0f, .0f, .0f}, 45.f); m_Camera = Camera({.0f, .0f, .0f}, 45.f);
m_Camera.Initialize(45.f, {.0f, .0f, .0f}, aspectRatio); m_Camera.Initialize(45.f, {.0f, .0f, .0f}, aspectRatio);
} }
@@ -67,7 +67,6 @@ namespace dae {
m_DevicePtr->Release(); m_DevicePtr->Release();
m_pScene->Cleanup(); m_pScene->Cleanup();
delete m_pScene;
//SDL //SDL
SDL_FreeSurface(m_pBackBuffer); SDL_FreeSurface(m_pBackBuffer);
@@ -80,7 +79,7 @@ namespace dae {
void Renderer::Update(const Timer *pTimer) { void Renderer::Update(const Timer *pTimer) {
m_Camera.Update(pTimer); m_Camera.Update(pTimer);
for (auto mesh: m_pScene->GetMeshes()) { for (auto& mesh: m_pScene->GetMeshes()) {
mesh->SetCameraPos(m_Camera.GetPosition()); mesh->SetCameraPos(m_Camera.GetPosition());
} }
if (m_Rotating) { if (m_Rotating) {
@@ -90,7 +89,7 @@ namespace dae {
Matrix rotationMatrix = Matrix::CreateRotationY(rotationThisFrame); Matrix rotationMatrix = Matrix::CreateRotationY(rotationThisFrame);
for (auto mesh: m_pScene->GetMeshes()) { for (auto& mesh: m_pScene->GetMeshes()) {
Matrix originalWorldMatrix = mesh->GetWorldMatrix(); Matrix originalWorldMatrix = mesh->GetWorldMatrix();
Matrix world = rotationMatrix * originalWorldMatrix; Matrix world = rotationMatrix * originalWorldMatrix;
@@ -114,50 +113,28 @@ namespace dae {
void Renderer::RenderDirectX() const { void Renderer::RenderDirectX() const {
//Clear back buffer //Clear back buffer
ColorRGB chosenClearColor = m_UseUniformClearColor ? m_UniformClearColor : DirectXClearColor; ColorRGB ChosenClearColor = m_UseUniformClearColor ? m_UniformClearColor : DirectXClearColor;
const float clearColor[] = { const float clearColor[] = {static_cast<float>(ChosenClearColor.r) / 255.f, static_cast<float>(ChosenClearColor.g) / 255.f,
static_cast<float>(chosenClearColor.r) / 255.f, static_cast<float>(ChosenClearColor.b) / 255.f, 1.f};
static_cast<float>(chosenClearColor.g) / 255.f,
static_cast<float>(chosenClearColor.b) / 255.f,
1.0f
};
m_DeviceContextPtr->ClearRenderTargetView(m_RenderTargetViewPtr, clearColor); m_DeviceContextPtr->ClearRenderTargetView(m_RenderTargetViewPtr, clearColor);
// Clear depth and stencil buffer
m_DeviceContextPtr->ClearDepthStencilView(m_DepthStencilViewPtr, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); m_DeviceContextPtr->ClearDepthStencilView(m_DepthStencilViewPtr, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
// Set viewport
D3D11_VIEWPORT viewport = {};
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
viewport.Width = static_cast<float>(m_Width);
viewport.Height = static_cast<float>(m_Height);
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
m_DeviceContextPtr->RSSetViewports(1, &viewport);
// Set camera matrix
Matrix viewProjMatrix = m_Camera.GetViewProjectionMatrix(); Matrix viewProjMatrix = m_Camera.GetViewProjectionMatrix();
for (auto& mesh: m_pScene->GetMeshes()) {
if (mesh->GetShouldRender()) {
Matrix modelMatrix = mesh->GetWorldMatrix();
Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix;
// Render all meshes in the scene mesh->Render(m_DeviceContextPtr, worldViewProjMatrix);
// for (auto mesh : m_pScene->GetMeshes()) { }
// if (mesh->GetShouldRender()) {
// Matrix modelMatrix = mesh->GetWorldMatrix();
// Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix;
//
// mesh->Render(m_DeviceContextPtr, worldViewProjMatrix);
// }
// }
// Call additional scene render logic (e.g., shadow rendering or post-processing)
m_pScene->Render(m_DeviceContextPtr, m_RenderTargetViewPtr, m_DepthStencilViewPtr, m_Camera);
// Present the rendered frame
HRESULT result = m_SwapChainPtr->Present(0, 0);
assert(SUCCEEDED(result) && "SwapChain Present failed");
} }
m_pScene->Render(m_DeviceContextPtr, m_RenderTargetViewPtr, m_DepthStencilViewPtr, m_Camera);
//Present
m_SwapChainPtr->Present(0, 0);
}
void Renderer::RenderSDL() { void Renderer::RenderSDL() {
ColorRGB ChosenClearColor = m_UseUniformClearColor ? m_UniformClearColor : m_ClearColorSoftware; ColorRGB ChosenClearColor = m_UseUniformClearColor ? m_UniformClearColor : m_ClearColorSoftware;
@@ -172,8 +149,8 @@ namespace dae {
m_VerticiesScreenSpace.clear(); m_VerticiesScreenSpace.clear();
for (auto *currentMesh: m_pScene->GetMeshes()) { for (auto& currentMeshUP: m_pScene->GetMeshes()) {
Mesh* currentMesh = currentMeshUP.get();
if (!currentMesh->GetShouldRender()) { if (!currentMesh->GetShouldRender()) {
continue; continue;
} }
@@ -223,14 +200,12 @@ namespace dae {
continue; continue;
} }
const float minX{std::min(vertex0.position.x, std::min(vertex1.position.x, vertex2.position.x))}; const float minX{std::min(vertex0.position.x, std::min(vertex1.position.x, vertex2.position.x))};
const float minY{std::min(vertex0.position.y, std::min(vertex1.position.y, vertex2.position.y))}; const float minY{std::min(vertex0.position.y, std::min(vertex1.position.y, vertex2.position.y))};
const float maxX{std::max(vertex0.position.x, std::max(vertex1.position.x, vertex2.position.x))}; const float maxX{std::max(vertex0.position.x, std::max(vertex1.position.x, vertex2.position.x))};
const float maxY{std::max(vertex0.position.y, std::max(vertex1.position.y, vertex2.position.y))}; const float maxY{std::max(vertex0.position.y, std::max(vertex1.position.y, vertex2.position.y))};
const Vector3 side1{vertex1.position - vertex0.position}; const Vector3 side1{vertex1.position - vertex0.position};
const Vector3 side2{vertex2.position - vertex0.position}; const Vector3 side2{vertex2.position - vertex0.position};
@@ -306,6 +281,7 @@ namespace dae {
SDL_UpdateWindowSurface(m_pWindow); SDL_UpdateWindowSurface(m_pWindow);
} }
HRESULT Renderer::InitializeDirectX() { HRESULT Renderer::InitializeDirectX() {
//1. Create device & deviceContext //1. Create device & deviceContext
//===== //=====
@@ -465,6 +441,7 @@ namespace dae {
} }
void Renderer::ToggleDepthBuffer() { void Renderer::ToggleDepthBuffer() {
m_isDepthBuffer = !m_isDepthBuffer; m_isDepthBuffer = !m_isDepthBuffer;
@@ -557,8 +534,10 @@ namespace dae {
return color; return color;
} }
void Renderer::CycleCullMode() { void Renderer::CycleCullMode() {
for (auto mesh: m_pScene->GetMeshes()) { for (auto& mesh: m_pScene->GetMeshes()) {
mesh->CycleCullMode(); mesh->CycleCullMode();
} }
@@ -627,7 +606,7 @@ namespace dae {
} }
void Renderer::NextSamplingState() { void Renderer::NextSamplingState() {
for (auto mesh: m_pScene->GetMeshes()) { for (auto& mesh: m_pScene->GetMeshes()) {
mesh->NextSamplingState(); mesh->NextSamplingState();
} }
@@ -652,7 +631,7 @@ namespace dae {
void Renderer::ToggleNormals() { void Renderer::ToggleNormals() {
m_useNormals = !m_useNormals; m_useNormals = !m_useNormals;
for (auto mesh: m_pScene->GetMeshes()) { for (auto& mesh: m_pScene->GetMeshes()) {
mesh->ToggleNormals(); mesh->ToggleNormals();
} }
std::string mode = m_useNormals ? "ON" : "OFF"; std::string mode = m_useNormals ? "ON" : "OFF";
@@ -681,7 +660,6 @@ namespace dae {
void Renderer::NextScene() { void Renderer::NextScene() {
m_pScene->Cleanup(); m_pScene->Cleanup();
delete m_pScene;
//Calculate the next scene //Calculate the next scene
int index = static_cast<int>(m_CurrentScene); int index = static_cast<int>(m_CurrentScene);
@@ -690,32 +668,38 @@ namespace dae {
switch (m_CurrentScene) { switch (m_CurrentScene) {
case SceneNames::Main: case SceneNames::Main:
m_pScene = new MainScene(); m_pScene = std::make_unique<MainScene>();
m_pFireMesh = nullptr; m_pFireMesh = nullptr;
std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Main" << RESET << std::endl; std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Main" << RESET << std::endl;
std::cout << MAGENTA << "This could take a second" << RESET << std::endl; std::cout << MAGENTA << "This could take a second" << RESET << std::endl;
break; break;
case SceneNames::Diorama: case SceneNames::Diorama:
m_pScene = new DioramaScene(); m_pScene = std::make_unique<DioramaScene>();
std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Diorama" << RESET << std::endl; std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Diorama" << RESET << std::endl;
std::cout << MAGENTA << "This could take a second" << RESET << std::endl; std::cout << MAGENTA << "This could take a second" << RESET << std::endl;
break; break;
case SceneNames::Instanced: case SceneNames::Instanced:
m_pScene = new InstancedScene(); m_pScene = std::make_unique<InstancedScene>();
std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Instanced" << RESET << std::endl; std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Instanced" << RESET << std::endl;
std::cout << MAGENTA << "This could take a second" << RESET << std::endl; std::cout << MAGENTA << "This could take a second" << RESET << std::endl;
break; break;
case SceneNames::Planet: case SceneNames::Planet:
m_pScene = new PlanetScene(); m_pScene = std::make_unique<PlanetScene>();
std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Planet" << RESET << std::endl; std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = Planet" << RESET << std::endl;
std::cout << MAGENTA << "This could take a second" << RESET << std::endl; std::cout << MAGENTA << "This could take a second" << RESET << std::endl;
break; break;
case SceneNames::ShadowTest:
m_pScene = std::make_unique<ShadowTestScene>();
std::cout << MAGENTA << "[SHARED]" << BLUE << " Scene = ShadowTest" << RESET << std::endl;
std::cout << MAGENTA << "This could take a second" << RESET << std::endl;
case SceneNames::Count: case SceneNames::Count:
break; break;
} }
@@ -728,7 +712,7 @@ namespace dae {
if (m_CurrentScene == SceneNames::Main) { if (m_CurrentScene == SceneNames::Main) {
//Kind of sloppy fix but hey :p //Kind of sloppy fix but hey :p
m_pFireMesh = m_pScene->GetMeshes().back(); m_pFireMesh = m_pScene->GetMeshes().back().get();
} }
} }

View File

@@ -5,7 +5,6 @@
#include "HitTest.h" #include "HitTest.h"
#include "Scenes/BaseScene.h" #include "Scenes/BaseScene.h"
#include "Effects/Effect.h" #include "Effects/Effect.h"
#include "Buffers/ShadowMapBuffer.h"
#include <unordered_map> #include <unordered_map>
@@ -29,6 +28,7 @@ enum class SceneNames{
Diorama, Diorama,
Instanced, Instanced,
Planet, Planet,
ShadowTest,
Count Count
}; };
@@ -80,7 +80,7 @@ namespace dae
Backendtype m_backendType{ Backendtype::DirectX }; Backendtype m_backendType{ Backendtype::DirectX };
BaseScene* m_pScene{}; std::unique_ptr<BaseScene> m_pScene{};
SceneNames m_CurrentScene{ SceneNames::Main }; SceneNames m_CurrentScene{ SceneNames::Main };
//Pos rot //Pos rot
std::unordered_map<SceneNames, std::pair<Vector3, Vector3>> m_SceneCameraPositions{}; std::unordered_map<SceneNames, std::pair<Vector3, Vector3>> m_SceneCameraPositions{};
@@ -91,10 +91,7 @@ namespace dae
float m_currentRotation{}; float m_currentRotation{};
bool m_UseUniformClearColor{ false }; 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} };
ShadowMapBuffer* m_pShadowMapBuffer{};
dae::Matrix m_LightViewProjectionMatrix{};
//DirectX vars //DirectX vars
@@ -104,7 +101,7 @@ namespace dae
HRESULT InitializeDirectX(); HRESULT InitializeDirectX();
void RenderDirectX() const; 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; //Storing the mesh so i can deactivate it;
Mesh* m_pFireMesh{}; Mesh* m_pFireMesh{};
@@ -138,7 +135,7 @@ namespace dae
bool m_isDepthBuffer{ false }; 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{}; float* m_pDepthBufferPixels{};

View File

@@ -25,9 +25,8 @@ public:
virtual void Cleanup() = 0; 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; virtual std::vector<std::shared_ptr<Material>>& GetMaterials() = 0;
}; };

View File

@@ -15,19 +15,20 @@ void DioramaScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devi
std::vector<std::unique_ptr<Utils::MaterialMesh>> materialMeshes; std::vector<std::unique_ptr<Utils::MaterialMesh>> materialMeshes;
Utils::LoadObjWithMaterials("resources/scene.obj", materialMeshes, true, DevicePtr); Utils::LoadObjWithMaterials("resources/scene.obj", materialMeshes, true, DevicePtr);
for (const auto &mesh: materialMeshes) { for (const auto &mesh: materialMeshes) {
if (mesh->vertices.size() > 0) { if (!mesh->vertices.empty()) {
std::shared_ptr<Material> material = std::make_shared<Material>(); std::shared_ptr<Material> material = std::make_shared<Material>();
BaseEffect *effect{nullptr}; std::unique_ptr<BaseEffect> effect{};
if (mesh->opacity_map != "") { if (!mesh->opacity_map.empty()) {
effect = new FireEffect(DevicePtr, L"resources/Fire.fx"); effect = std::make_unique<FireEffect>(DevicePtr, L"resources/Fire.fx");
material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr);
} else { } else {
material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); 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(); Matrix worldMatrix = m_meshes.back()->GetWorldMatrix();
worldMatrix *= Matrix::CreateScale(2.f, 2.f, 2.f); 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) { for (const auto &mesh: materialMeshes) {
if (!mesh->vertices.empty()) { if (!mesh->vertices.empty()) {
std::shared_ptr<Material> material = std::make_shared<Material>(); 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); 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(); Matrix worldMatrix = m_meshes.back()->GetWorldMatrix();
worldMatrix *= Matrix::CreateRotationY(3.14f / 2.f); 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; return m_meshes;
} }
@@ -90,9 +93,6 @@ std::vector<std::shared_ptr<Material>> &DioramaScene::GetMaterials() {
} }
void DioramaScene::Cleanup() { void DioramaScene::Cleanup() {
for (Mesh *mesh: m_meshes) {
delete mesh;
}
m_meshes.clear(); m_meshes.clear();
m_materials.clear(); m_materials.clear();
} }

View File

@@ -3,13 +3,13 @@
#include "BaseScene.h" #include "BaseScene.h"
class DioramaScene : public BaseScene { class DioramaScene final : public BaseScene {
public: public:
void Cleanup() override; void Cleanup() override;
void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) 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; 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; void Render(ID3D11DeviceContext* devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, ID3D11DepthStencilView *depthStencilViewPtr, const Camera& camera) override;
private: private:
std::vector<Mesh *> m_meshes{}; std::vector<std::unique_ptr<Mesh>> m_meshes{};
std::vector<std::shared_ptr<Material>> m_materials{}; std::vector<std::shared_ptr<Material>> m_materials{};
std::vector<Mesh*> m_brokMeshses{ nullptr }; std::vector<Mesh*> m_brokMeshses{ nullptr };

View File

@@ -43,7 +43,9 @@ void InstancedScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *De
float scale = 2; float scale = 2;
//use the perlin noise to generate the YOffset //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::CreateTranslation(x * scale, YOffset, y * scale);
data.worldMatrix *= Matrix::CreateScale(0.5f, 0.5f, 0.5f); 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); 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();
effect->NextSamplingState(); //Dirty hack 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() { void InstancedScene::Cleanup() {
for (auto mesh: m_instancedMeshes) {
delete mesh;
}
m_instancedMeshes.clear(); m_instancedMeshes.clear();
for (auto mesh: m_meshes) {
delete mesh;
}
m_meshes.clear(); m_meshes.clear();
} }
std::vector<Mesh *> &InstancedScene::GetMeshes() { std::vector<std::unique_ptr<Mesh>> &InstancedScene::GetMeshes() {
return m_meshes; return m_meshes;
} }
@@ -81,7 +77,7 @@ std::vector<std::shared_ptr<Material>> &InstancedScene::GetMaterials() {
void InstancedScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, void InstancedScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr,
ID3D11DepthStencilView *depthStencilViewPtr, const Camera &camera) { ID3D11DepthStencilView *depthStencilViewPtr, const Camera &camera) {
Matrix viewProjMatrix = camera.GetViewProjectionMatrix(); Matrix viewProjMatrix = camera.GetViewProjectionMatrix();
for (auto mesh: m_instancedMeshes) { for (auto& mesh: m_instancedMeshes) {
Matrix modelMatrix = mesh->GetWorldMatrix(); Matrix modelMatrix = mesh->GetWorldMatrix();
Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix; Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix;
mesh->Render(devicePtr, worldViewProjMatrix); mesh->Render(devicePtr, worldViewProjMatrix);
@@ -96,8 +92,9 @@ void InstancedScene::Update() {
InstancedData data; InstancedData data;
float scale = 2; float scale = 2;
//Generate sine wave based on x and y and the SDL_GetTicks //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); float currentTick = static_cast<float>(SDL_GetTicks());
YOffset += (x * 0.1f + y * 0.1f) * 0.1f; 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::CreateTranslation(x * scale, YOffset, y * scale);
data.worldMatrix *= Matrix::CreateScale(0.5f, 0.5f, 0.5f); data.worldMatrix *= Matrix::CreateScale(0.5f, 0.5f, 0.5f);

View File

@@ -6,7 +6,7 @@
#include "../InstancedMesh.h" #include "../InstancedMesh.h"
#include "../PerlinNoise.hpp" #include "../PerlinNoise.hpp"
class InstancedScene : public BaseScene { class InstancedScene final : public BaseScene {
public: public:
void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override; void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override;
@@ -16,7 +16,7 @@ public:
void Cleanup() 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; std::vector<std::shared_ptr<Material>> &GetMaterials() override;
@@ -24,9 +24,9 @@ private:
ID3D11DeviceContext* m_DeviceContextPtr{}; ID3D11DeviceContext* m_DeviceContextPtr{};
std::vector<Mesh*> m_meshes; std::vector<std::unique_ptr<Mesh>> m_meshes;
//Kind of hack since InstancedMesh doesnt extend mesh //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; std::vector<std::shared_ptr<Material>> m_materials;
const siv::PerlinNoise::seed_type seed = 123456u; const siv::PerlinNoise::seed_type seed = 123456u;

View File

@@ -26,8 +26,9 @@ void MainScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceC
vehicleMaterial->specularTexturePtr = Texture::LoadFromFile("resources/vehicle_specular.png", DevicePtr); vehicleMaterial->specularTexturePtr = Texture::LoadFromFile("resources/vehicle_specular.png", DevicePtr);
vehicleMaterial->glossTexturePtr = Texture::LoadFromFile("resources/vehicle_gloss.png", DevicePtr); vehicleMaterial->glossTexturePtr = Texture::LoadFromFile("resources/vehicle_gloss.png", DevicePtr);
auto* effect = new Effect(DevicePtr, L"resources/PosCol3D.fx"); auto effect = std::make_unique<Effect>(DevicePtr, L"resources/PosCol3D.fx");
m_meshes.push_back(new Mesh(DevicePtr, vertices, indices, vehicleMaterial, effect)); 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(); 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>(); std::shared_ptr<Material> FireMaterial = std::make_shared<Material>();
FireMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/fireFX_diffuse.png", DevicePtr); FireMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/fireFX_diffuse.png", DevicePtr);
auto* fireEffect = new FireEffect(DevicePtr, L"resources/Fire.fx"); auto fireEffect = std::make_unique<FireEffect>(DevicePtr, L"resources/Fire.fx");
m_meshes.push_back(new Mesh(DevicePtr, vertices, indices, FireMaterial, fireEffect)); 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 = m_meshes.back()->GetWorldMatrix();
worldMatrix *= Matrix::CreateTranslation(0, 0, 50.f); worldMatrix *= Matrix::CreateTranslation(0, 0, 50.f);
@@ -55,13 +57,10 @@ void MainScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceC
void MainScene::Cleanup() { void MainScene::Cleanup() {
for (Mesh* mesh : m_meshes) {
delete mesh;
}
m_meshes.clear(); m_meshes.clear();
} }
std::vector<Mesh *> &MainScene::GetMeshes() { std::vector<std::unique_ptr<Mesh>> &MainScene::GetMeshes() {
return m_meshes; return m_meshes;
} }

View File

@@ -10,13 +10,13 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
class MainScene : public BaseScene { class MainScene final : public BaseScene {
public: public:
void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override; void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override;
void Cleanup() 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; std::vector<std::shared_ptr<Material>> &GetMaterials() override;
@@ -27,7 +27,7 @@ public:
private: private:
std::vector<Mesh*> m_meshes{}; std::vector<std::unique_ptr<Mesh>> m_meshes{};
std::vector<std::shared_ptr<Material>> m_materials{}; std::vector<std::shared_ptr<Material>> m_materials{};
}; };

View File

@@ -60,8 +60,9 @@ void PlanetScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devic
m_InstancedData.push_back(data); m_InstancedData.push_back(data);
} }
auto *rockEffect = new Effect(DevicePtr, L"resources/InstancedSimpleDiffuse.fx"); auto rockEffect = std::make_unique<Effect>(DevicePtr, L"resources/InstancedSimpleDiffuse.fx");
m_instancedMeshes.push_back(new InstancedMesh(DevicePtr, vertices, indices, rockMaterial, rockEffect, m_InstancedData)); auto rockMesh = std::make_unique<InstancedMesh>(DevicePtr, vertices, indices, rockMaterial, std::move(rockEffect), m_InstancedData);
m_instancedMeshes.push_back(std::move(rockMesh));
indices.clear(); indices.clear();
vertices.clear(); vertices.clear();
@@ -74,8 +75,10 @@ void PlanetScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devic
std::shared_ptr<Material> planetMaterial = std::make_shared<Material>(); std::shared_ptr<Material> planetMaterial = std::make_shared<Material>();
planetMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/planet/mars.png", DevicePtr); planetMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/planet/mars.png", DevicePtr);
auto* planetEffect = new Effect(DevicePtr, L"resources/SimpleDiffuse.fx"); auto planetEffect = std::make_unique<Effect>(DevicePtr, L"resources/SimpleDiffuse.fx");
m_meshes.push_back(new Mesh(DevicePtr, vertices, indices, planetMaterial, planetEffect)); 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(); indices.clear();
vertices.clear(); vertices.clear();
@@ -88,9 +91,10 @@ void PlanetScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devic
std::shared_ptr<Material> skyboxMaterial = std::make_shared<Material>(); std::shared_ptr<Material> skyboxMaterial = std::make_shared<Material>();
skyboxMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/planet/skybox/space_nebula_6k.png", DevicePtr); skyboxMaterial->diffuseTexturePtr = Texture::LoadFromFile("resources/planet/skybox/space_nebula_6k.png", DevicePtr);
auto* skyboxEffect = new Effect(DevicePtr, L"resources/SimpleDiffuse.fx"); auto skyboxEffect = std::make_unique<Effect>(DevicePtr, L"resources/SimpleDiffuse.fx");
m_meshes.push_back(new Mesh(DevicePtr, vertices, indices, skyboxMaterial, skyboxEffect)); auto skyBoxMesh = std::make_unique<Mesh>(DevicePtr, vertices, indices, skyboxMaterial, std::move(skyboxEffect));
m_skyboxMesh = m_meshes.back(); m_meshes.push_back(std::move(skyBoxMesh));
m_skyboxMesh = m_meshes.back().get();
Matrix worldMatrix = m_meshes.back()->GetWorldMatrix(); Matrix worldMatrix = m_meshes.back()->GetWorldMatrix();
worldMatrix *= Matrix::CreateScale(0.1f, 0.1f, 0.1f); worldMatrix *= Matrix::CreateScale(0.1f, 0.1f, 0.1f);
@@ -98,19 +102,12 @@ void PlanetScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *Devic
} }
void PlanetScene::Cleanup() { void PlanetScene::Cleanup() {
for (auto mesh: m_instancedMeshes) {
delete mesh;
}
m_instancedMeshes.clear(); m_instancedMeshes.clear();
for (auto mesh: m_meshes) {
delete mesh;
}
m_meshes.clear(); m_meshes.clear();
} }
std::vector<Mesh *> &PlanetScene::GetMeshes() { std::vector<std::unique_ptr<Mesh>> &PlanetScene::GetMeshes() {
return m_meshes; return m_meshes;
} }
@@ -121,7 +118,7 @@ std::vector<std::shared_ptr<Material>> &PlanetScene::GetMaterials() {
void PlanetScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, void PlanetScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr,
ID3D11DepthStencilView *depthStencilViewPtr, const Camera &camera) { ID3D11DepthStencilView *depthStencilViewPtr, const Camera &camera) {
Matrix viewProjMatrix = camera.GetViewProjectionMatrix(); Matrix viewProjMatrix = camera.GetViewProjectionMatrix();
for (auto mesh: m_instancedMeshes) { for (auto& mesh: m_instancedMeshes) {
Matrix modelMatrix = mesh->GetWorldMatrix(); Matrix modelMatrix = mesh->GetWorldMatrix();
Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix; Matrix worldViewProjMatrix = modelMatrix * viewProjMatrix;
mesh->Render(devicePtr, worldViewProjMatrix); mesh->Render(devicePtr, worldViewProjMatrix);
@@ -137,8 +134,13 @@ void PlanetScene::Update() {
//set the skybox to the camera //set the skybox to the camera
Matrix skyboxMatrix = m_skyboxMesh->GetWorldMatrix(); Matrix skyboxMatrix = m_skyboxMesh->GetWorldMatrix();
Vector3 cameraPos = m_Camera->GetPosition(); Vector3 cameraPos = m_Camera->GetPosition();
skyboxMatrix.SetTranslation(cameraPos); skyboxMatrix.SetTranslation(cameraPos);
m_skyboxMesh->SetWorldMatrix(skyboxMatrix); m_skyboxMesh->SetWorldMatrix(skyboxMatrix);
//Rotate the planet slowly
Matrix planetMatrix = m_planetMesh->GetWorldMatrix();
planetMatrix *= Matrix::CreateRotationY(-0.0001f);
m_planetMesh->SetWorldMatrix(planetMatrix);
} }

View File

@@ -6,7 +6,7 @@
#include "BaseScene.h" #include "BaseScene.h"
#include "../InstancedMesh.h" #include "../InstancedMesh.h"
class PlanetScene : public BaseScene { class PlanetScene final : public BaseScene {
public: public:
void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override; void Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) override;
@@ -16,7 +16,7 @@ public:
void Cleanup() 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; std::vector<std::shared_ptr<Material>> &GetMaterials() override;
@@ -24,13 +24,14 @@ private:
ID3D11DeviceContext* m_DeviceContextPtr{}; ID3D11DeviceContext* m_DeviceContextPtr{};
std::vector<Mesh*> m_meshes; std::vector<std::unique_ptr<Mesh>> m_meshes;
//Kind of hack since InstancedMesh doesnt extend mesh //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<InstancedData> m_InstancedData;
std::vector<std::shared_ptr<Material>> m_materials; std::vector<std::shared_ptr<Material>> m_materials;
Mesh* m_skyboxMesh; Mesh* m_skyboxMesh;
Mesh* m_planetMesh;
Camera* m_Camera; Camera* m_Camera;
}; };

View File

@@ -7,6 +7,7 @@
#include "../Effects/ShadowEffect.h" #include "../Effects/ShadowEffect.h"
#include "../Effects/Effect.h" #include "../Effects/Effect.h"
#include "../Buffers/DX11Viewport.h" #include "../Buffers/DX11Viewport.h"
#include "../RenderSettings.h"
void ShadowTestScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) { void ShadowTestScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *DeviceContextPtr, Camera *camera) {
// Initialize shadow map buffer // Initialize shadow map buffer
@@ -15,31 +16,49 @@ void ShadowTestScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *D
assert(true && "Shadow map buffer failed to initialize"); assert(true && "Shadow map buffer failed to initialize");
} }
// Initialize light source // Initialize light source
m_Light.SetPosition({-20.0f, 30.0f, 0.0f}); m_Light.SetPosition({-20.0f, 60.0f, 0.0f});
m_Light.SetTarget({0, -5, 40}); m_Light.SetTarget({0, -5, 40});
m_Light.SetUp({0.0f, 1.0f, 0.0f}); m_Light.SetUp({0.0f, 1.0f, 0.0f});
std::vector<VertexIn> vertices{}; std::vector<VertexIn> vertices{};
std::vector<uint32_t> indices{}; std::vector<uint32_t> indices{};
if(!Utils::ParseOBJNew("resources/ShadingDemo.obj", vertices, indices, true)){ if(!Utils::ParseOBJNew("resources/ShadingDemo.obj", vertices, indices, true)){
assert(true && "Model failed to load"); assert(true && "Model failed to load");
} }
auto material = std::make_shared<Material>(); auto material = std::make_shared<Material>();
// material->diffuseTexturePtr = Texture::LoadFromFile("resources/vehicle_diffuse.png", DevicePtr); material->diffuseTexturePtr = Texture::LoadFromFile("resources/shadowTestTexture.png", DevicePtr);
auto shadowEffect = new ShadowEffect(DevicePtr, L"resources/shadowEffect.fx"); auto shadowEffect = new ShadowEffect(DevicePtr, L"resources/shadowEffect.fx");
auto otherEffect = new Effect(DevicePtr, L"resources/SuperSimpleDiffuse.fx"); auto otherEffect = new ShadowDiffuse(DevicePtr, L"resources/SuperSimpleDiffuse.fx");
auto shadowMesh = new ShadowMesh(DevicePtr, vertices, indices, material, shadowEffect, otherEffect); auto shadowMesh = new ShadowMesh(DevicePtr, vertices, indices, material, shadowEffect, otherEffect);
if(!Utils::ParseOBJNew("resources/tuktuk.obj", vertices, indices, true)){
assert(true && "Model failed to load");
}
material = std::make_shared<Material>();
material->diffuseTexturePtr = Texture::LoadFromFile("resources/tuktuk.png", DevicePtr);
shadowEffect = new ShadowEffect(DevicePtr, L"resources/shadowEffect.fx");
otherEffect = new ShadowDiffuse(DevicePtr, L"resources/SuperSimpleDiffuse.fx");
auto shadowMesh2 = new ShadowMesh(DevicePtr, vertices, indices, material, shadowEffect, otherEffect);
shadowMesh2->SetWorldMatrix(Matrix::CreateTranslation(Vector3(0, -5, 40)));
m_tuktukMesh = shadowMesh2;
m_shadowMeshes.push_back(shadowMesh2);
//
// std::vector<std::unique_ptr<Utils::MaterialMesh>> materialMeshes; // std::vector<std::unique_ptr<Utils::MaterialMesh>> materialMeshes;
// Utils::LoadObjWithMaterials("resources/scene.obj", materialMeshes, true, DevicePtr); // Utils::LoadObjWithMaterials("resources/scene.obj", materialMeshes, true, DevicePtr);
// for (const auto &mesh: materialMeshes) { // for (const auto &mesh: materialMeshes) {
// if (mesh->vertices.size() > 0) { // if (mesh->vertices.size() > 0) {
// std::shared_ptr<Material> material = std::make_shared<Material>(); // std::shared_ptr<Material> material = std::make_shared<Material>();
// BaseEffect *effect = new Effect(DevicePtr, L"resources/SuperSimpleDiffuse.fx"); // auto* effect = new ShadowDiffuse(DevicePtr, L"resources/SuperSimpleDiffuse.fx");
// ShadowEffect* shadowEffect = new ShadowEffect(DevicePtr, L"resources/shadowEffect.fx"); // ShadowEffect* shadowEffect = new ShadowEffect(DevicePtr, L"resources/shadowEffect.fx");
// material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr); // material->diffuseTexturePtr = Texture::LoadFromFile("./resources/diorama/" + mesh->diffuse_texture, DevicePtr);
// //
@@ -68,14 +87,20 @@ void ShadowTestScene::Initialize(ID3D11Device *DevicePtr, ID3D11DeviceContext *D
} }
void ShadowTestScene::Update() { void ShadowTestScene::Update() {
// m_Light.SetTarget(lightTarget); // m_Light.SetTarget(lightTarget);
Vector3 pos = m_Light.GetPosition(); Vector3 pos = m_Light.GetPosition();
pos.y = sin(SDL_GetTicks() / 1000.f) * 10.f + 10.f; pos.y = sin(SDL_GetTicks() / 1000.f) * 10.f + 10.f;
m_Light.SetPosition(pos); m_Light.SetPosition(pos);
m_Light.Update(); m_Light.Update();
//rotate tutkuk
Matrix newOne;
newOne *= Matrix::CreateRotationY(0.001f * SDL_GetTicks());
newOne *= Matrix::CreateTranslation(Vector3(20, -5, 40));
m_tuktukMesh->SetWorldMatrix(newOne);
} }
void ShadowTestScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr, void ShadowTestScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr,
@@ -108,7 +133,7 @@ void ShadowTestScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetV
// Set the depthmap correctly // Set the depthmap correctly
DX11Viewport ColorViewport(640, 480); DX11Viewport ColorViewport(RenderSettings::GetInstance().getWidth(), RenderSettings::GetInstance().getHeight());
ColorViewport.Apply(devicePtr); ColorViewport.Apply(devicePtr);
@@ -129,24 +154,18 @@ void ShadowTestScene::Render(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetV
auto* effect = dynamic_cast<ShadowMesh*>(mesh)->GetColorEffectPtr() ; auto* effect = dynamic_cast<ShadowMesh*>(mesh)->GetColorEffectPtr() ;
dynamic_cast<Effect*>(effect)->SetWorldViewProjMatrix(worldViewProj); effect->SetWorldViewProjMatrix(worldViewProj);
dynamic_cast<Effect*>(effect)->SetWorldMatrix(mesh->GetWorldMatrix()); effect->SetWorldMatrix(mesh->GetWorldMatrix());
dynamic_cast<Effect*>(effect)->SetShadowMapSampler(shadowSampler); effect->SetShadowMap(shadowMap);
dynamic_cast<Effect*>(effect)->SetShadowMap(shadowMap); effect->SetLightViewProjMatrix(lightWorldViewProj);
dynamic_cast<Effect*>(effect)->SetLightViewProjMatrix(lightWorldViewProj); effect->SetLightDirection(m_Light.GetDirection());
effect->SetLightColor(m_Light.GetColor());
dynamic_cast<ShadowMesh*>(mesh)->RenderFinal(devicePtr, worldViewProj); dynamic_cast<ShadowMesh*>(mesh)->RenderFinal(devicePtr, worldViewProj);
} }
} }
void ShadowTestScene::Cleanup() { void ShadowTestScene::Cleanup() {
for (auto *mesh : m_Meshes) {
delete mesh;
}
m_Meshes.clear();
for (auto *mesh : m_shadowMeshes) { for (auto *mesh : m_shadowMeshes) {
delete mesh; delete mesh;
@@ -158,7 +177,7 @@ void ShadowTestScene::Cleanup() {
} }
std::vector<Mesh *> &ShadowTestScene::GetMeshes() { std::vector<std::unique_ptr<Mesh>> & ShadowTestScene::GetMeshes() {
return m_Meshes; return m_Meshes;
} }

View File

@@ -3,7 +3,7 @@
#include "BaseScene.h" #include "BaseScene.h"
#include "../Buffers/ShadowMapBuffer.h" #include "../Buffers/ShadowMapBuffer.h"
#include "../Light.h" #include "../DirectionalLight.h"
#include "../ShadowMesh.h" #include "../ShadowMesh.h"
class ShadowTestScene: public BaseScene { class ShadowTestScene: public BaseScene {
@@ -17,24 +17,25 @@ public:
void Cleanup() 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; std::vector<std::shared_ptr<Material>> &GetMaterials() override;
private: private:
std::vector<Mesh *> m_Meshes; std::vector<std::unique_ptr<Mesh>> m_Meshes;
std::vector<std::shared_ptr<Material>> m_Materials; std::vector<std::shared_ptr<Material>> m_Materials;
std::vector<ShadowMesh *> m_shadowMeshes; std::vector<ShadowMesh *> m_shadowMeshes;
std::vector<std::shared_ptr<Material>> m_shadowMaterials; std::vector<std::shared_ptr<Material>> m_shadowMaterials;
ShadowMapBuffer *m_ShadowMapBuffer{nullptr}; ShadowMapBuffer *m_ShadowMapBuffer{nullptr};
Light m_Light; DirectionalLight m_Light;
float angle = 0.0f; float angle = 0.0f;
ShadowMesh* m_tuktukMesh;
void RenderShadowMapToScreen(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr); void RenderShadowMapToScreen(ID3D11DeviceContext *devicePtr, ID3D11RenderTargetView *renderTargetViewPtr);
}; };

View File

@@ -8,7 +8,7 @@ ShadowMesh::ShadowMesh(ID3D11Device* devicePtr,
const std::vector<Uint32>& indices, const std::vector<Uint32>& indices,
std::shared_ptr<Material> material, std::shared_ptr<Material> material,
ShadowEffect* shadowEffectPtr, ShadowEffect* shadowEffectPtr,
BaseEffect* colorEffectPtr) ShadowDiffuse* colorEffectPtr)
: m_ShadowEffectPtr(shadowEffectPtr), : m_ShadowEffectPtr(shadowEffectPtr),
m_ColorEffectPtr(colorEffectPtr), m_ColorEffectPtr(colorEffectPtr),
m_VerticesIn(verticesIn), m_VerticesIn(verticesIn),

View File

@@ -7,6 +7,7 @@
#include "Effects/ShadowEffect.h" #include "Effects/ShadowEffect.h"
#include "Material.h" #include "Material.h"
#include "Mesh.h" #include "Mesh.h"
#include "Effects/ShadowDiffuse.h"
class ShadowMesh { class ShadowMesh {
public: public:
@@ -15,7 +16,7 @@ public:
const std::vector<Uint32>& indices, const std::vector<Uint32>& indices,
std::shared_ptr<Material> material, std::shared_ptr<Material> material,
ShadowEffect* shadowEffectPtr, ShadowEffect* shadowEffectPtr,
BaseEffect* colorEffectPtr); ShadowDiffuse* colorEffectPtr);
~ShadowMesh(); ~ShadowMesh();
@@ -26,7 +27,7 @@ public:
Matrix GetWorldMatrix() const; Matrix GetWorldMatrix() const;
ShadowEffect* GetShadowEffectPtr(){ return m_ShadowEffectPtr; } ShadowEffect* GetShadowEffectPtr(){ return m_ShadowEffectPtr; }
BaseEffect* GetColorEffectPtr(){ return m_ColorEffectPtr; } ShadowDiffuse* GetColorEffectPtr(){ return m_ColorEffectPtr; }
private: private:
@@ -34,7 +35,7 @@ private:
ShadowEffect* m_ShadowEffectPtr; ShadowEffect* m_ShadowEffectPtr;
// Color effect for final render // Color effect for final render
BaseEffect* m_ColorEffectPtr; ShadowDiffuse* m_ColorEffectPtr;
// Buffers // Buffers
ID3D11InputLayout* m_InputLayoutPtr; ID3D11InputLayout* m_InputLayoutPtr;

30
project/src/Singleton.h Normal file
View File

@@ -0,0 +1,30 @@
//
// Created by Bram on 16/01/2025.
//
#ifndef GP1_DIRECTX_SINGLETON_H
#define GP1_DIRECTX_SINGLETON_H
template<typename T>
class Singleton {
public:
static T &GetInstance() {
static T instance{};
return instance;
}
virtual ~Singleton() = default;
Singleton(Singleton &&other) = delete;
Singleton(const Singleton &other) = delete;
Singleton &operator=(Singleton &&other) = delete;
Singleton &operator=(const Singleton &other) = delete;
protected:
Singleton() = default;
};
#endif //GP1_DIRECTX_SINGLETON_H

View File

@@ -12,7 +12,7 @@
using namespace dae; using namespace dae;
class Texture { class Texture final {
public: public:
~Texture(); ~Texture();
@@ -28,7 +28,7 @@ private:
ID3D11ShaderResourceView* m_TextureResourceViewPtr{}; ID3D11ShaderResourceView* m_TextureResourceViewPtr{};
ID3D11Texture2D* m_TexturePtr{}; ID3D11Texture2D* m_TexturePtr{};
SDL_Surface* m_SurfacePtr{ nullptr }; const SDL_Surface* m_SurfacePtr{ nullptr };
uint32_t* m_pSurfacePixels{ nullptr }; uint32_t* m_pSurfacePixels{ nullptr };
}; };

View File

@@ -5,7 +5,7 @@
namespace dae namespace dae
{ {
class Timer class Timer final
{ {
public: public:
Timer(); Timer();

View File

@@ -396,3 +396,13 @@ namespace dae {
} }
} }
template<typename T>
class DirectXDeleter
{
public:
void operator()(T* p)
{
p->Release();
}
};

View File

@@ -11,6 +11,7 @@
#include "Renderer.h" #include "Renderer.h"
#include "GamePadController.h" #include "GamePadController.h"
#include "Utils.h" #include "Utils.h"
#include "RenderSettings.h"
using namespace dae; using namespace dae;
@@ -119,6 +120,7 @@ void CheckController(Renderer* pRenderer, bool& printFPS){
} }
} }
int main(int argc, char *args[]) { int main(int argc, char *args[]) {
//Unreferenced parameters //Unreferenced parameters
(void) argc; (void) argc;
@@ -128,10 +130,19 @@ int main(int argc, char *args[]) {
//Create window + surfaces //Create window + surfaces
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK); SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK);
//
// const uint32_t width = 640;
// const uint32_t height = 480;
const uint32_t width = 640;
const uint32_t height = 480;
const uint32_t width = 900;
const uint32_t height = 600;
RenderSettings::GetInstance().setHeight(height);
RenderSettings::GetInstance().setWidth(width);
//// const uint32_t width = 640;
//// const uint32_t height = 480;
SDL_Window *pWindow = SDL_CreateWindow( SDL_Window *pWindow = SDL_CreateWindow(