1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#include "CombineRenderer.h"
#include "PlayerViewport.h"
#include "../PreferencesCache.h"
#include "../../nCine/Graphics/RenderQueue.h"
namespace Jazz2::Rendering
{
CombineRenderer::CombineRenderer(PlayerViewport* owner)
: _owner(owner)
{
setVisitOrderState(SceneNode::VisitOrderState::Disabled);
}
void CombineRenderer::Initialize(std::int32_t x, std::int32_t y, std::int32_t width, std::int32_t height)
{
_bounds = Rectf(static_cast<float>(x), static_cast<float>(y), static_cast<float>(width), static_cast<float>(height));
if (_renderCommand.GetMaterial().SetShader(_owner->_levelHandler->_combineShader)) {
_renderCommand.GetMaterial().ReserveUniformsDataMemory();
_renderCommand.GetGeometry().SetDrawParameters(GL_TRIANGLE_STRIP, 0, 4);
auto* textureUniform = _renderCommand.GetMaterial().Uniform(Material::TextureUniformName);
if (textureUniform && textureUniform->GetIntValue(0) != 0) {
textureUniform->SetIntValue(0); // GL_TEXTURE0
}
auto* lightTexUniform = _renderCommand.GetMaterial().Uniform("uTextureLighting");
if (lightTexUniform && lightTexUniform->GetIntValue(0) != 1) {
lightTexUniform->SetIntValue(1); // GL_TEXTURE1
}
auto* blurHalfTexUniform = _renderCommand.GetMaterial().Uniform("uTextureBlurHalf");
if (blurHalfTexUniform && blurHalfTexUniform->GetIntValue(0) != 2) {
blurHalfTexUniform->SetIntValue(2); // GL_TEXTURE2
}
auto* blurQuarterTexUniform = _renderCommand.GetMaterial().Uniform("uTextureBlurQuarter");
if (blurQuarterTexUniform && blurQuarterTexUniform->GetIntValue(0) != 3) {
blurQuarterTexUniform->SetIntValue(3); // GL_TEXTURE3
}
}
if (_renderCommandWithWater.GetMaterial().SetShader(_owner->_levelHandler->_combineWithWaterShader)) {
_renderCommandWithWater.GetMaterial().ReserveUniformsDataMemory();
_renderCommandWithWater.GetGeometry().SetDrawParameters(GL_TRIANGLE_STRIP, 0, 4);
auto* textureUniform = _renderCommandWithWater.GetMaterial().Uniform(Material::TextureUniformName);
if (textureUniform && textureUniform->GetIntValue(0) != 0) {
textureUniform->SetIntValue(0); // GL_TEXTURE0
}
auto* lightTexUniform = _renderCommandWithWater.GetMaterial().Uniform("uTextureLighting");
if (lightTexUniform && lightTexUniform->GetIntValue(0) != 1) {
lightTexUniform->SetIntValue(1); // GL_TEXTURE1
}
auto* blurHalfTexUniform = _renderCommandWithWater.GetMaterial().Uniform("uTextureBlurHalf");
if (blurHalfTexUniform && blurHalfTexUniform->GetIntValue(0) != 2) {
blurHalfTexUniform->SetIntValue(2); // GL_TEXTURE2
}
auto* blurQuarterTexUniform = _renderCommandWithWater.GetMaterial().Uniform("uTextureBlurQuarter");
if (blurQuarterTexUniform && blurQuarterTexUniform->GetIntValue(0) != 3) {
blurQuarterTexUniform->SetIntValue(3); // GL_TEXTURE3
}
auto* noiseTexUniform = _renderCommandWithWater.GetMaterial().Uniform("uTextureNoise");
if (noiseTexUniform && noiseTexUniform->GetIntValue(0) != 4) {
noiseTexUniform->SetIntValue(4); // GL_TEXTURE4
}
}
_renderCommand.SetTransformation(Matrix4x4f::Translation((float)x, (float)y, 0.0f));
_renderCommandWithWater.SetTransformation(Matrix4x4f::Translation((float)x, (float)y, 0.0f));
}
Rectf CombineRenderer::GetBounds() const
{
return _bounds;
}
bool CombineRenderer::OnDraw(RenderQueue& renderQueue)
{
float viewWaterLevel = _owner->_levelHandler->_waterLevel - _owner->_cameraPos.Y + _bounds.H * 0.5f;
bool viewHasWater = (viewWaterLevel < _bounds.H);
auto& command = (viewHasWater ? _renderCommandWithWater : _renderCommand);
command.GetMaterial().SetTexture(0, *_owner->_viewTexture);
command.GetMaterial().SetTexture(1, *_owner->_lightingBuffer);
command.GetMaterial().SetTexture(2, *_owner->_blurPass2.GetTarget());
command.GetMaterial().SetTexture(3, *_owner->_blurPass4.GetTarget());
if (viewHasWater && !PreferencesCache::LowWaterQuality) {
command.GetMaterial().SetTexture(4, *_owner->_levelHandler->_noiseTexture);
}
auto* instanceBlock = command.GetMaterial().UniformBlock(Material::InstanceBlockName);
instanceBlock->GetUniform(Material::TexRectUniformName)->SetFloatValue(1.0f, 0.0f, 1.0f, 0.0f);
instanceBlock->GetUniform(Material::SpriteSizeUniformName)->SetFloatValue(_bounds.W, _bounds.H);
instanceBlock->GetUniform(Material::ColorUniformName)->SetFloatVector(Colorf::White.Data());
command.GetMaterial().Uniform("uAmbientColor")->SetFloatVector(_owner->_ambientLight.Data());
command.GetMaterial().Uniform("uTime")->SetFloatValue(_owner->_levelHandler->_elapsedFrames * 0.0018f);
if (viewHasWater) {
command.GetMaterial().Uniform("uWaterLevel")->SetFloatValue(viewWaterLevel / _bounds.H);
command.GetMaterial().Uniform("uCameraPos")->SetFloatVector(_owner->_cameraPos.Data());
}
renderQueue.AddCommand(&command);
return true;
}
}
|