diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 4dd39ff8acc..ac97e8b3813 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -376,6 +376,7 @@ 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); +GLAPI void glFogi(GLenum pname, GLint param); #ifdef __cplusplus } diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index 131d4568f50..51793a9975f 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -79,6 +79,7 @@ public: 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 gl_fogi(GLenum pname, GLint param) = 0; virtual void present() = 0; }; diff --git a/Userland/Libraries/LibGL/GLFog.cpp b/Userland/Libraries/LibGL/GLFog.cpp index 37fc2253e59..7f427f43dc8 100644 --- a/Userland/Libraries/LibGL/GLFog.cpp +++ b/Userland/Libraries/LibGL/GLFog.cpp @@ -18,3 +18,8 @@ void glFogf(GLenum pname, GLfloat param) { g_gl_context->gl_fogf(pname, param); } + +void glFogi(GLenum pname, GLint param) +{ + g_gl_context->gl_fogi(pname, param); +} diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index 9ffc09de248..c7cd5b5922e 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -1783,6 +1783,24 @@ void SoftwareGLContext::gl_fogf(GLenum pname, GLfloat param) m_rasterizer.set_options(options); } +void SoftwareGLContext::gl_fogi(GLenum pname, GLint param) +{ + RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); + RETURN_WITH_ERROR_IF(!(param == GL_EXP || param == GL_EXP2 || param != GL_LINEAR), GL_INVALID_ENUM); + + auto options = m_rasterizer.options(); + + switch (pname) { + case GL_FOG_MODE: + options.fog_mode = 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 48875f0eab7..3239c13afb5 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -89,6 +89,7 @@ public: 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 gl_fogi(GLenum pname, GLint param) override; virtual void present() override; private: diff --git a/Userland/Libraries/LibGL/SoftwareRasterizer.h b/Userland/Libraries/LibGL/SoftwareRasterizer.h index 27c421032a5..cfdd4b20c93 100644 --- a/Userland/Libraries/LibGL/SoftwareRasterizer.h +++ b/Userland/Libraries/LibGL/SoftwareRasterizer.h @@ -40,6 +40,7 @@ struct RasterizerOptions { 0.0f, }; GLfloat fog_density { 1.0f }; + GLenum fog_mode { GL_EXP }; }; class SoftwareRasterizer final {