Browse Source

LibGL: Implement `glFogi`

Jesse Buhagiar 3 years ago
parent
commit
d73cc3d0eb

+ 1 - 0
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
 }

+ 1 - 0
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;
 };

+ 5 - 0
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);
+}

+ 18 - 0
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);

+ 1 - 0
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:

+ 1 - 0
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 {