Forráskód Böngészése

LibGL: Implement `glLightModelf` and `glLightModelfv`

Jelle Raaijmakers 3 éve
szülő
commit
c2960e68a8

+ 5 - 0
Userland/Libraries/LibGL/GL/gl.h

@@ -169,6 +169,9 @@ extern "C" {
 #define GL_RGBA 0x1908
 #define GL_RGBA 0x1908
 
 
 // Lighting related defines
 // Lighting related defines
+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
+#define GL_LIGHT_MODEL_AMBIENT 0x0B53
+
 #define GL_FLAT 0x1D00
 #define GL_FLAT 0x1D00
 #define GL_SMOOTH 0x1D01
 #define GL_SMOOTH 0x1D01
 #define GL_AMBIENT 0x1200
 #define GL_AMBIENT 0x1200
@@ -458,6 +461,8 @@ GLAPI void glPixelStorei(GLenum pname, GLint param);
 GLAPI void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
 GLAPI void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
 GLAPI void glLightf(GLenum light, GLenum pname, GLfloat param);
 GLAPI void glLightf(GLenum light, GLenum pname, GLfloat param);
 GLAPI void glLightfv(GLenum light, GLenum pname, GLfloat* param);
 GLAPI void glLightfv(GLenum light, GLenum pname, GLfloat* param);
+GLAPI void glLightModelf(GLenum pname, GLfloat param);
+GLAPI void glLightModelfv(GLenum pname, GLfloat const* params);
 GLAPI void glStencilFunc(GLenum func, GLint ref, GLuint mask);
 GLAPI void glStencilFunc(GLenum func, GLint ref, GLuint mask);
 GLAPI void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
 GLAPI void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
 GLAPI void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);
 GLAPI void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);

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

@@ -101,6 +101,7 @@ public:
     virtual void gl_line_width(GLfloat width) = 0;
     virtual void gl_line_width(GLfloat width) = 0;
     virtual void gl_push_attrib(GLbitfield mask) = 0;
     virtual void gl_push_attrib(GLbitfield mask) = 0;
     virtual void gl_pop_attrib() = 0;
     virtual void gl_pop_attrib() = 0;
+    virtual void gl_light_model(GLenum pname, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0;
 
 
     virtual void present() = 0;
     virtual void present() = 0;
 };
 };

+ 16 - 0
Userland/Libraries/LibGL/GLLights.cpp

@@ -23,6 +23,22 @@ void glLightfv(GLenum light, GLenum pname, GLfloat* param)
     dbgln_if(GL_DEBUG, "glLightfv({}, {}, {}): unimplemented", light, pname, param);
     dbgln_if(GL_DEBUG, "glLightfv({}, {}, {}): unimplemented", light, pname, param);
 }
 }
 
 
+void glLightModelf(GLenum pname, GLfloat param)
+{
+    g_gl_context->gl_light_model(pname, param, 0.0f, 0.0f, 0.0f);
+}
+
+void glLightModelfv(GLenum pname, GLfloat const* params)
+{
+    switch (pname) {
+    case GL_LIGHT_MODEL_AMBIENT:
+        g_gl_context->gl_light_model(pname, params[0], 0.0f, 0.0f, 0.0f);
+        break;
+    default:
+        g_gl_context->gl_light_model(pname, params[0], params[1], params[2], params[3]);
+    }
+}
+
 void glMaterialf(GLenum face, GLenum pname, GLfloat param)
 void glMaterialf(GLenum face, GLenum pname, GLfloat param)
 {
 {
     VERIFY(face == GL_SHININESS);
     VERIFY(face == GL_SHININESS);

+ 21 - 0
Userland/Libraries/LibGL/SoftwareGLContext.cpp

@@ -2345,6 +2345,27 @@ void SoftwareGLContext::gl_pop_attrib()
     dbgln_if(GL_DEBUG, "SoftwareGLContext FIXME: implement gl_pop_attrib()");
     dbgln_if(GL_DEBUG, "SoftwareGLContext FIXME: implement gl_pop_attrib()");
 }
 }
 
 
+void SoftwareGLContext::gl_light_model(GLenum pname, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+    APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_light_model, pname, x, y, z, w);
+
+    RETURN_WITH_ERROR_IF(!(pname == GL_LIGHT_MODEL_AMBIENT
+                             || pname == GL_LIGHT_MODEL_TWO_SIDE),
+        GL_INVALID_ENUM);
+
+    switch (pname) {
+    case GL_LIGHT_MODEL_AMBIENT:
+        m_light_model_ambient = { x, y, z, w };
+        break;
+    case GL_LIGHT_MODEL_TWO_SIDE:
+        VERIFY(y == 0.0f && z == 0.0f && w == 0.0f);
+        m_light_model_two_side = x;
+        break;
+    default:
+        VERIFY_NOT_REACHED();
+    }
+}
+
 void SoftwareGLContext::present()
 void SoftwareGLContext::present()
 {
 {
     m_rasterizer.blit_to(*m_frontbuffer);
     m_rasterizer.blit_to(*m_frontbuffer);

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

@@ -112,6 +112,7 @@ public:
     virtual void gl_line_width(GLfloat width) override;
     virtual void gl_line_width(GLfloat width) override;
     virtual void gl_push_attrib(GLbitfield mask) override;
     virtual void gl_push_attrib(GLbitfield mask) override;
     virtual void gl_pop_attrib() override;
     virtual void gl_pop_attrib() override;
+    virtual void gl_light_model(GLenum pname, GLfloat x, GLfloat y, GLfloat z, GLfloat w) override;
     virtual void present() override;
     virtual void present() override;
 
 
 private:
 private:
@@ -284,7 +285,8 @@ private:
             decltype(&SoftwareGLContext::gl_materialv),
             decltype(&SoftwareGLContext::gl_materialv),
             decltype(&SoftwareGLContext::gl_line_width),
             decltype(&SoftwareGLContext::gl_line_width),
             decltype(&SoftwareGLContext::gl_push_attrib),
             decltype(&SoftwareGLContext::gl_push_attrib),
-            decltype(&SoftwareGLContext::gl_pop_attrib)>;
+            decltype(&SoftwareGLContext::gl_pop_attrib),
+            decltype(&SoftwareGLContext::gl_light_model)>;
 
 
         using ExtraSavedArguments = Variant<
         using ExtraSavedArguments = Variant<
             FloatMatrix4x4>;
             FloatMatrix4x4>;
@@ -333,6 +335,9 @@ private:
     RasterPosition m_current_raster_position;
     RasterPosition m_current_raster_position;
 
 
     float m_line_width { 1.0f };
     float m_line_width { 1.0f };
+
+    FloatVector4 m_light_model_ambient { 0.2f, 0.2f, 0.2f, 1.0f };
+    GLfloat m_light_model_two_side { 0.0f };
 };
 };
 
 
 }
 }