From e2c5462c38289af5c4e8ab7f2456021a8034b755 Mon Sep 17 00:00:00 2001 From: Ethan Adams Date: Wed, 26 Feb 2025 14:33:26 -0500 Subject: [PATCH] Quicky hacky solution for blur timings. Not scalable, needs future refactoring --- Resources/shaders/GL_postprocess.frag | 54 ++++++++--------- Resources/shaders/GL_postprocess.vert | 10 ++-- YuppleMayham/include/graphics/postprocess.h | 12 +++- YuppleMayham/include/util.h | 2 + YuppleMayham/include/utility/events.h | 8 +++ YuppleMayham/src/gameplay/gameactor.cpp | 1 + YuppleMayham/src/graphics/postprocess.cpp | 64 +++++++++++++-------- YuppleMayham/src/graphics/renderer.cpp | 7 +++ 8 files changed, 101 insertions(+), 57 deletions(-) diff --git a/Resources/shaders/GL_postprocess.frag b/Resources/shaders/GL_postprocess.frag index c66e222..df5c36a 100644 --- a/Resources/shaders/GL_postprocess.frag +++ b/Resources/shaders/GL_postprocess.frag @@ -5,14 +5,16 @@ layout (std140) uniform uPostProcess { int dt; vec3 colorMod; float blurIntensity; + float blurDuration; float shakeIntensity; - float shakeTime; + float shakeDuration; int effects; vec3 colorMod_hud; float blurIntensity_hud; + float blurDuration_hud; float shakeIntensity_hud; - float shakeTime_hud; + float shakeDuration_hud; int effects_hud; }; out vec4 FragColor; @@ -31,36 +33,34 @@ void main() { if (worldOrHud == false) { - /* - vec2 offsets[9] = vec2[]( - vec2(-offset, offset), // top-left - vec2( 0.0f, offset), // top-center - vec2( offset, offset), // top-right - vec2(-offset, 0.0f), // center-left - vec2( 0.0f, 0.0f), // center-center - vec2( offset, 0.0f), // center-right - vec2(-offset, -offset), // bottom-left - vec2( 0.0f, -offset), // bottom-center - vec2( offset, -offset) // bottom-right - ); - vec2 tex_offset = 1.0 / vec2(800.0, 600.0); // gets size of single texel - vec4 result = vec4(0.0); - vec4 sampleTex[9]; - for (int i = 0; i < 9; i++) - { - sampleTex[i] = vec4(texture(screenTexture, texCoord.st + offsets[i])); - } - for (int i = 0; i < 9; i++) - result += sampleTex[i] * edge_kernel[i]; - */ - //FragColor = mix(vec4(result), vec4(0.4, 0.0, 0.7, 1.0), 0.2); - if ((effects & (1 << 1)) != 0) + if ((effects & 1) != 0) // BLUR { + vec4 result = vec4(0.0); + vec2 offsets[9] = vec2[]( + vec2(-offset, offset), // top-left + vec2( 0.0f, offset), // top-center + vec2( offset, offset), // top-right + vec2(-offset, 0.0f), // center-left + vec2( 0.0f, 0.0f), // center-center + vec2( offset, 0.0f), // center-right + vec2(-offset, -offset), // bottom-left + vec2( 0.0f, -offset), // bottom-center + vec2( offset, -offset) // bottom-right + ); + vec4 sampleTex[9]; + for (int i = 0; i < 9; i++) + { + sampleTex[i] = vec4(texture(screenTexture, texCoord.st + offsets[i])); + } + for (int i = 0; i < 9; i++) + result += sampleTex[i] * blur_kernel[i]; //FragColor = mix(texture(screenTexture, texCoord), vec4(1.0, 0.8, 0.0, 1.0), 0.3 - (1.0 / shakeTime) * shakeIntensity); - FragColor = texture(screenTexture, texCoord); + //FragColor = vec4(1.0 / blurDuration, 1.0, 0.0, 1.0); + FragColor = vec4(result); } else { + //FragColor = vec4(1.0, 0.0, 1.0 / blurDuration, 1.0); FragColor = texture(screenTexture, texCoord); } } diff --git a/Resources/shaders/GL_postprocess.vert b/Resources/shaders/GL_postprocess.vert index 6e1b480..00349ef 100644 --- a/Resources/shaders/GL_postprocess.vert +++ b/Resources/shaders/GL_postprocess.vert @@ -7,14 +7,16 @@ layout (std140) uniform uPostProcess { int dt; vec3 colorMod; float blurIntensity; + float blurDuration; float shakeIntensity; - float shakeTime; + float shakeDuration; int effects; vec3 colorMod_hud; float blurIntensity_hud; + float blurDuration_hud; float shakeIntensity_hud; - float shakeTime_hud; + float shakeDuration_hud; int effects_hud; }; @@ -48,8 +50,8 @@ void main() //SHAKE if ((effects_hud & (1 << 1)) != 0) { - gl_Position.x += cos(shakeTime_hud - 90) * 0.01; - gl_Position.y += cos(shakeTime_hud - 80) * 0.01; + gl_Position.x += cos(dt - 90) * shakeIntensity_hud; + gl_Position.y += cos(dt - 80) * shakeIntensity_hud; } } } \ No newline at end of file diff --git a/YuppleMayham/include/graphics/postprocess.h b/YuppleMayham/include/graphics/postprocess.h index bb099fc..a497664 100644 --- a/YuppleMayham/include/graphics/postprocess.h +++ b/YuppleMayham/include/graphics/postprocess.h @@ -4,10 +4,12 @@ #include #include #include +#include #include #include #include #include +#include class Postprocessor { @@ -22,7 +24,8 @@ public: GREYSCALE = 1 << 4 }; - void ApplyEffect(EFFECT effect, float intensity=0.f, float effectDuration=0.f, glm::vec3 colorModifer=glm::vec3(0.0f)); + + void ApplyEffect(EFFECT effect, float intensity=0.f, float effectDuration=UTIL::INF_TIME, glm::vec3 colorModifer=glm::vec3(0.0f)); void RemoveEffects(EFFECT effect); void RemoveAllEffects(); @@ -49,17 +52,20 @@ private: alignas(4) int dt; alignas(16) glm::vec3 colorMod; alignas(4) float blurIntensity; + alignas(4) float blurDuration; alignas(4) float shakeIntensity; - alignas(4) float shakeTime; + alignas(4) float shakeDuration; alignas(4) int curEffects; // hud alignas(16) glm::vec3 colorMod_hud; alignas(4) float blurIntensity_hud; + alignas(4) float blurDuration_hud; alignas(4) float shakeIntensity_hud; - alignas(4) float shakeTime_hud; + alignas(4) float shakeDuration_hud; alignas(4) int curEffects_hud; }postProcessData; + void tickEffectTime(bool worldOrHud); unsigned int lastTime; Shader* postProcessShader; }; diff --git a/YuppleMayham/include/util.h b/YuppleMayham/include/util.h index 54a80fc..f05d726 100644 --- a/YuppleMayham/include/util.h +++ b/YuppleMayham/include/util.h @@ -6,6 +6,8 @@ namespace UTIL { + constexpr float INF_TIME = -99.6875f; + void flip_surface(SDL_Surface* surface); class RandomGenerator diff --git a/YuppleMayham/include/utility/events.h b/YuppleMayham/include/utility/events.h index f161c81..8bece31 100644 --- a/YuppleMayham/include/utility/events.h +++ b/YuppleMayham/include/utility/events.h @@ -103,6 +103,14 @@ public: float duration; }; +class ScreenBlurEvent : public Event { +public: + ScreenBlurEvent(float intensity, float duration) : intensity(intensity), duration(duration) {} + std::string getType() const override { return "OnScreenBlur"; } + float intensity; + float duration; +}; + class EventManager { public: using EventCallback = std::function)>; diff --git a/YuppleMayham/src/gameplay/gameactor.cpp b/YuppleMayham/src/gameplay/gameactor.cpp index c0453f7..9e02e46 100644 --- a/YuppleMayham/src/gameplay/gameactor.cpp +++ b/YuppleMayham/src/gameplay/gameactor.cpp @@ -100,6 +100,7 @@ void GameActor::fireWeapon()const { if (sceneContext->getPlayerID() == entityid) { if (auto gEvent = sceneContext->getGlobalEventManager().lock()) { gEvent->notify(std::make_shared(0.01f, 0.8f)); + gEvent->notify(std::make_shared(1.f, 0.8f)); } } } diff --git a/YuppleMayham/src/graphics/postprocess.cpp b/YuppleMayham/src/graphics/postprocess.cpp index 050f69a..6736f48 100644 --- a/YuppleMayham/src/graphics/postprocess.cpp +++ b/YuppleMayham/src/graphics/postprocess.cpp @@ -1,5 +1,6 @@ #include "graphics/postprocess.h" #include +#include Postprocessor::Postprocessor(const std::shared_ptr& resourceManager) { @@ -40,9 +41,10 @@ void Postprocessor::ApplyEffect(EFFECT effect, float intensity, float effectDura postProcessData.curEffects |= effect; if ((effect & EFFECT::BLUR) != 0) { postProcessData.blurIntensity = intensity; + postProcessData.blurDuration = effectDuration; } else if ((effect & EFFECT::SHAKE) != 0) { postProcessData.shakeIntensity = intensity; - postProcessData.shakeTime = effectDuration; + postProcessData.shakeDuration = effectDuration; } if ((effect & EFFECT::COLORMOD) != 0) { postProcessData.colorMod = colorModifer; @@ -67,18 +69,8 @@ void Postprocessor::applyPostProcess(bool worldOrHud) postProcessData.curTime = curTime; postProcessData.dt = curTime - lastTime; - auto subtractTime = [](float remaining, unsigned int dt){ - if ((remaining - 1.0f / static_cast(dt)) <= 0.0f) - return 0.0f; - return remaining - (1.0f / static_cast(dt)); - }; - if (!worldOrHud) - postProcessData.shakeTime = subtractTime(postProcessData.shakeTime, postProcessData.dt); - else - postProcessData.shakeTime_hud = subtractTime(postProcessData.shakeTime_hud, postProcessData.dt); - if (postProcessData.shakeTime <= 0.0f) { - RemoveEffects(SHAKE); - } + tickEffectTime(worldOrHud); + LOG(DEBUG, "Blur duration: {}", postProcessData.blurDuration); postProcessShader->use(); postProcessShader->setBool("worldOrHud", worldOrHud); @@ -86,17 +78,43 @@ void Postprocessor::applyPostProcess(bool worldOrHud) glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(PostProcessData_t), &postProcessData); - /* - PostProcessData_t* pp_data = (PostProcessData_t*)glMapBuffer( - GL_UNIFORM_BUFFER, - GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); - if (pp_data) { - std::memcpy(pp_data, &postProcessData, sizeof(PostProcessData_t)); - glUnmapBuffer(GL_UNIFORM_BUFFER); - } - */ - glBindBuffer(GL_UNIFORM_BUFFER, 0); lastTime = curTime; +} + +void Postprocessor::tickEffectTime(bool worldOrHud) +{ + auto subtractTime = [](float remaining, float dt){ + if (remaining == UTIL::INF_TIME) { + return remaining; + } + else if ((remaining - 1.0f / dt) <= 0.0f) + return 0.0f; + return remaining - (1.0f / dt); + }; + auto checkToRemove = [](float timeLeft) { + return timeLeft != UTIL::INF_TIME && timeLeft <= 0.f; // checking if the duration is not INF_TIME and is leq than 0.0f + }; + // !!! FIX THIS, IT WORKS BUT NOT A SCALABLE SOLUTION !!! + float dt = static_cast(postProcessData.dt); + if (worldOrHud) { + postProcessData.blurDuration_hud = subtractTime(postProcessData.blurDuration_hud, dt); + postProcessData.shakeDuration_hud = subtractTime(postProcessData.shakeDuration_hud, dt); + if (checkToRemove(postProcessData.blurDuration_hud)) { + //RemoveEffects(BLUR); + } + if (checkToRemove(postProcessData.shakeDuration_hud)) { + //RemoveEffects(SHAKE); + } + } else { + postProcessData.blurDuration = subtractTime(postProcessData.blurDuration, dt); + postProcessData.shakeDuration = subtractTime(postProcessData.shakeDuration, dt); + if (checkToRemove(postProcessData.blurDuration)) { + RemoveEffects(BLUR); + } + if (checkToRemove(postProcessData.shakeDuration)) { + RemoveEffects(SHAKE); + } + } } \ No newline at end of file diff --git a/YuppleMayham/src/graphics/renderer.cpp b/YuppleMayham/src/graphics/renderer.cpp index c47ecc9..9f66f62 100644 --- a/YuppleMayham/src/graphics/renderer.cpp +++ b/YuppleMayham/src/graphics/renderer.cpp @@ -29,6 +29,13 @@ void Renderer::hookEventManager(std::weak_ptr eventManager) shakeEvent->duration ); }); + e->subscribe("OnScreenBlur", [this](std::shared_ptr event) { + auto blurEvent = std::dynamic_pointer_cast(event); + postProcessor->ApplyEffect(Postprocessor::BLUR, + blurEvent->intensity, + blurEvent->duration + ); + }); } }