#ifndef WW_RENDERPASSES_H #define WW_RENDERPASSES_H #include #include class CFramebuffer; class SShader; class CBindOwnFramebufferPassElement final: public IPassElement { public: explicit CBindOwnFramebufferPassElement(CFramebuffer* pFramebuffer) : m_pFramebuffer {pFramebuffer} {} void draw(const CRegion& damage) override; bool needsLiveBlur() override { return false; } bool needsPrecomputeBlur() override { return false; } const char* passName() override { return "BIND_OWN_FRAMEBUFFER"; } std::optional boundingBox() override { return std::nullopt; } CRegion opaqueRegion() override { return CRegion {}; } private: CFramebuffer* m_pFramebuffer; }; class CRenderWobblyWindowPassElement final: public IPassElement { static inline SShader* s_shader {}; static inline constexpr unsigned int s_SUBDIVS = 8; static_assert(s_SUBDIVS > 0); static inline GLuint s_VAO, s_VBO, s_VBO_UVs, s_EBO; public: static inline std::vector s_baseVerts; explicit CRenderWobblyWindowPassElement(CFramebuffer* pOldFramebuffer, PHLWINDOWREF pWindow) : m_pOldFramebuffer {pOldFramebuffer}, m_pWindow {pWindow} {} static void initGPUObjects(); void draw(const CRegion& damage) override; bool needsLiveBlur() override { return true; } bool needsPrecomputeBlur() override { return false; } const char* passName() override { return "RENDER_WOBBLY_WINDOW"; } std::optional boundingBox() override; CRegion opaqueRegion() override { return CRegion {}; } private: CFramebuffer* m_pOldFramebuffer; PHLWINDOWREF m_pWindow; static inline SShader* s_pShader = nullptr; }; #endif