diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index d165f8124a4bfb..4dd39ff8accb6c 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -375,6 +375,7 @@ GLAPI void glDepthRange(GLdouble nearVal, GLdouble farVal); GLAPI void glDepthFunc(GLenum func); GLAPI void glPolygonMode(GLenum face, GLenum mode); GLAPI void glFogfv(GLenum mode, GLfloat* params); +GLAPI void glFogf(GLenum pname, GLfloat param); #ifdef __cplusplus } diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index 30bb6342d12af7..131d4568f505ef 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -78,6 +78,7 @@ class GLContext { virtual void gl_depth_func(GLenum func) = 0; virtual void gl_polygon_mode(GLenum face, GLenum mode) = 0; virtual void gl_fogfv(GLenum pname, GLfloat* params) = 0; + virtual void gl_fogf(GLenum pname, GLfloat params) = 0; virtual void present() = 0; }; diff --git a/Userland/Libraries/LibGL/GLFog.cpp b/Userland/Libraries/LibGL/GLFog.cpp index 381119c3deca63..37fc2253e590c7 100644 --- a/Userland/Libraries/LibGL/GLFog.cpp +++ b/Userland/Libraries/LibGL/GLFog.cpp @@ -13,3 +13,8 @@ void glFogfv(GLenum pname, GLfloat* params) { g_gl_context->gl_fogfv(pname, params); } + +void glFogf(GLenum pname, GLfloat param) +{ + g_gl_context->gl_fogf(pname, param); +} diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index ca73b70c200d2f..9ffc09de24831c 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -1765,6 +1765,24 @@ void SoftwareGLContext::gl_fogfv(GLenum pname, GLfloat* params) m_rasterizer.set_options(options); } +void SoftwareGLContext::gl_fogf(GLenum pname, GLfloat param) +{ + RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); + RETURN_WITH_ERROR_IF(param < 0.0f, GL_INVALID_VALUE); + + auto options = m_rasterizer.options(); + + switch (pname) { + case GL_FOG_DENSITY: + options.fog_density = param; + break; + default: + RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM); + } + + m_rasterizer.set_options(options); +} + void SoftwareGLContext::present() { m_rasterizer.blit_to(*m_frontbuffer); diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.h b/Userland/Libraries/LibGL/SoftwareGLContext.h index 5b84ceafd0e14e..48875f0eab7d8c 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -88,6 +88,7 @@ class SoftwareGLContext : public GLContext { virtual void gl_depth_func(GLenum func) override; virtual void gl_polygon_mode(GLenum face, GLenum mode) override; virtual void gl_fogfv(GLenum pname, GLfloat* params) override; + virtual void gl_fogf(GLenum pname, GLfloat param) override; virtual void present() override; private: diff --git a/Userland/Libraries/LibGL/SoftwareRasterizer.h b/Userland/Libraries/LibGL/SoftwareRasterizer.h index c110f794e94684..27c421032a5bb2 100644 --- a/Userland/Libraries/LibGL/SoftwareRasterizer.h +++ b/Userland/Libraries/LibGL/SoftwareRasterizer.h @@ -39,6 +39,7 @@ struct RasterizerOptions { 0.0f, 0.0f, }; + GLfloat fog_density { 1.0f }; }; class SoftwareRasterizer final {