diff --git a/Userland/Libraries/LibGL/CMakeLists.txt b/Userland/Libraries/LibGL/CMakeLists.txt index 6cff68532c..baabd30e7c 100644 --- a/Userland/Libraries/LibGL/CMakeLists.txt +++ b/Userland/Libraries/LibGL/CMakeLists.txt @@ -7,6 +7,7 @@ set(SOURCES GLBlend.cpp GLColor.cpp GLContext.cpp + GLFog.cpp GLLights.cpp GLLists.cpp GLMat.cpp diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 43092a2f41..d165f8124a 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -374,6 +374,7 @@ GLAPI void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* i 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); #ifdef __cplusplus } diff --git a/Userland/Libraries/LibGL/GLContext.h b/Userland/Libraries/LibGL/GLContext.h index 31bfeb6e91..30bb6342d1 100644 --- a/Userland/Libraries/LibGL/GLContext.h +++ b/Userland/Libraries/LibGL/GLContext.h @@ -77,6 +77,7 @@ public: virtual void gl_depth_range(GLdouble min, GLdouble max) = 0; 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 present() = 0; }; diff --git a/Userland/Libraries/LibGL/GLFog.cpp b/Userland/Libraries/LibGL/GLFog.cpp new file mode 100644 index 0000000000..381119c3de --- /dev/null +++ b/Userland/Libraries/LibGL/GLFog.cpp @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021, Jesse Buhagiar + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "GL/gl.h" +#include "GLContext.h" + +extern GL::GLContext* g_gl_context; + +void glFogfv(GLenum pname, GLfloat* params) +{ + g_gl_context->gl_fogfv(pname, params); +} diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index b4c7c05357..ca73b70c20 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -1745,6 +1745,26 @@ void SoftwareGLContext::gl_polygon_mode(GLenum face, GLenum mode) m_rasterizer.set_options(options); } +void SoftwareGLContext::gl_fogfv(GLenum pname, GLfloat* params) +{ + RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); + + auto options = m_rasterizer.options(); + + switch (pname) { + case GL_FOG_COLOR: + // Set rasterizer options fog color + // NOTE: We purposefully don't check for `nullptr` here (as with other calls). The spec states nothing + // about us checking for such things. If the programmer does so and hits SIGSEGV, that's on them. + options.fog_color = FloatVector4 { params[0], params[1], params[2], params[3] }; + 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 1f578b79b0..5b84ceafd0 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.h +++ b/Userland/Libraries/LibGL/SoftwareGLContext.h @@ -87,6 +87,7 @@ public: virtual void gl_depth_range(GLdouble min, GLdouble max) override; 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 present() override; private: diff --git a/Userland/Libraries/LibGL/SoftwareRasterizer.h b/Userland/Libraries/LibGL/SoftwareRasterizer.h index 2d19484ddb..c110f794e9 100644 --- a/Userland/Libraries/LibGL/SoftwareRasterizer.h +++ b/Userland/Libraries/LibGL/SoftwareRasterizer.h @@ -33,6 +33,12 @@ struct RasterizerOptions { float depth_max { 1 }; GLenum depth_func { GL_LESS }; GLenum polygon_mode { GL_FILL }; + FloatVector4 fog_color { + 0.0f, + 0.0f, + 0.0f, + 0.0f, + }; }; class SoftwareRasterizer final {