Explorar o código

LibGL: Implement `glFogf`

Jesse Buhagiar %!s(int64=4) %!d(string=hai) anos
pai
achega
f55d2a22af

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

+ 1 - 0
Userland/Libraries/LibGL/GLContext.h

@@ -78,6 +78,7 @@ public:
     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;
 };

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

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

+ 1 - 0
Userland/Libraries/LibGL/SoftwareGLContext.h

@@ -88,6 +88,7 @@ public:
     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:

+ 1 - 0
Userland/Libraries/LibGL/SoftwareRasterizer.h

@@ -39,6 +39,7 @@ struct RasterizerOptions {
         0.0f,
         0.0f,
     };
+    GLfloat fog_density { 1.0f };
 };
 
 class SoftwareRasterizer final {