4 #include <unordered_map>
19 using std::unordered_map;
33 ShadowMapRenderShader::ShadowMapRenderShader(
Renderer* renderer): renderer(renderer)
44 for (
const auto& [shaderId, shader]:
shaders) {
45 shader->unloadTextures();
52 bool initialized =
true;
53 for (
const auto& [shaderId, shader]:
shaders) {
54 initialized&= shader->isInitialized();
61 for (
const auto& [shaderId, shader]:
shaders) {
76 for (
auto& shadowMappingShaderRenderContext:
contexts) {
77 if (shadowMappingShaderRenderContext.implementation !=
nullptr) {
78 shadowMappingShaderRenderContext.implementation->unUseProgram(i);
80 shadowMappingShaderRenderContext.implementation =
nullptr;
88 auto& shadowMappingShaderRenderContext =
contexts[contextIdx];
89 if (shadowMappingShaderRenderContext.implementation ==
nullptr)
return;
90 shadowMappingShaderRenderContext.implementation->updateMatrices(contextIdx);
94 auto& shadowMappingShaderRenderContext =
contexts[contextIdx];
95 if (shadowMappingShaderRenderContext.implementation ==
nullptr)
return;
96 shadowMappingShaderRenderContext.implementation->updateTextureMatrix(
renderer, contextIdx);
101 auto& shadowMappingShaderRenderContext =
contexts[contextIdx];
102 if (shadowMappingShaderRenderContext.implementation ==
nullptr)
return;
103 shadowMappingShaderRenderContext.implementation->updateMaterial(
renderer, contextIdx);
107 auto& shadowMappingShaderRenderContext =
contexts[contextIdx];
108 if (shadowMappingShaderRenderContext.implementation ==
nullptr)
return;
109 shadowMappingShaderRenderContext.implementation->updateLight(
renderer, contextIdx,
lightId);
113 auto& shadowMappingShaderRenderContext =
contexts[contextIdx];
114 if (shadowMappingShaderRenderContext.implementation ==
nullptr)
return;
115 shadowMappingShaderRenderContext.implementation->updateShaderParameters(
renderer, contextIdx);
120 auto& shadowMappingShaderRenderContext =
contexts[contextIdx];
121 if (shadowMappingShaderRenderContext.implementation ==
nullptr)
return;
122 shadowMappingShaderRenderContext.implementation->bindTexture(
renderer, contextIdx, textureId);
128 auto& shadowMappingShaderRenderContext =
contexts[contextIdx];
129 if (shadowMappingShaderRenderContext.implementation ==
nullptr)
return;
130 shadowMappingShaderRenderContext.implementation->setDepthBiasMVPMatrix(contextIdx, this->depthBiasMVPMatrix);
140 if (StringTools::startsWith(
id,
string(
"pbr-")) ==
true) {
141 shaderId = StringTools::substring(
id, 4);
147 auto& shadowMappingShaderRenderContext =
contexts[contextIdx];
148 auto currentImplementation = shadowMappingShaderRenderContext.implementation;
149 auto shaderIt =
shaders.find(shaderId);
150 if (shaderIt ==
shaders.end()) {
151 shaderIt =
shaders.find(
"default");
153 auto nextImplementation = shaderIt->second;
154 if (currentImplementation != nextImplementation) {
155 if (currentImplementation !=
nullptr) currentImplementation->unUseProgram(contextIdx);
156 shadowMappingShaderRenderContext.implementation = nextImplementation;
157 shadowMappingShaderRenderContext.implementation->useProgram(
engine, contextIdx);
160 shadowMappingShaderRenderContext.implementation->setDepthBiasMVPMatrix(contextIdx,
depthBiasMVPMatrix);
161 shadowMappingShaderRenderContext.implementation->setRenderLightId(
lightId);
165 for (
const auto& [shaderId, shader]:
shaders) {
166 shader->unloadTextures();
167 shader->loadTextures(pathName);
static int getThreadCount()
virtual bool isSupportingMultithreadedRendering()=0
Shadow mapping default shader to render shadow map.
static bool isSupported(Renderer *renderer)
Shadow mapping foliage shader to render shadow map.
static bool isSupported(Renderer *renderer)
Shadow mapping tree shader to render shadow map.
static bool isSupported(Renderer *renderer)
Shadow mapping shader to render shadow maps.
void initialize()
Initialize shadow map render shader program.
unordered_map< string, ShadowMapRenderShaderImplementation * > shaders
void updateLight(int contextIdx, int32_t lightId)
Update light.
void updateMatrices(int contextIdx)
Update matrices.
void setDepthBiasMVPMatrix(int contextIdx, const Matrix4x4 &depthBiasMVPMatrix)
Set up program depth bias mvp matrix.
Matrix4x4 depthBiasMVPMatrix
void setRenderLightId(int32_t lightId)
Set light id.
void useProgram(Engine *engine)
Use shadow map render shader program.
~ShadowMapRenderShader()
Destructor.
void setShader(int contextIdx, const string &id)
Set shader.
vector< ShadowMapRenderShaderContext > contexts
void updateTextureMatrix(int contextIdx)
Update up texture matrix.
void updateShaderParameters(int contextIdx)
Update shader parameters.
void updateMaterial(int contextIdx)
Update material.
void bindTexture(int contextIdx, int32_t textureId)
Bind texture.
void loadTextures(const string &pathName)
Load textures.
void unUseProgram()
Unuse shadow map render shader program.
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Shadow mapping shader interface to render shadow map.