Files
GP1-DirectX/project/src/Effects/Effect.cpp
2025-01-13 17:12:23 +01:00

205 lines
7.6 KiB
C++

#include "../pch.h"
#include "Effect.h"
#include "../Utils.h"
#include <fstream>
Effect::Effect(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_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)]);
}
Effect::~Effect() {
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;
for(auto sampler : m_SamplerStates){
sampler->Release();
}
for(auto rasterizer : m_RasterizerStates){
rasterizer->Release();
}
m_EffectPtr->Release();
m_EffectPtr = nullptr;
}
void Effect::SetWorldMatrix(const dae::Matrix &world) const {
m_MatWorldVariablePtr->SetMatrix(reinterpret_cast<const float*>(&world));
}
void Effect::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 Effect::SetCameraPos(const dae::Vector3 &pos) const {
m_CameraPosVariablePtr->SetFloatVector(reinterpret_cast<const float*>(&pos));
}
void Effect::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 Effect::ToggleNormals() {
m_UseNormalMap = !m_UseNormalMap;
m_UseNormalMapVariablePtr->SetBool(m_UseNormalMap);
}
void Effect::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 Effect::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 Effect::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)]);
}