Parcourir la source

LibGL: Add stubs for `glMaterialf` and `glMaterialfv`

Jelle Raaijmakers il y a 3 ans
Parent
commit
9dbc8d7e3c

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

@@ -170,6 +170,13 @@ extern "C" {
 // Lighting related defines
 #define GL_FLAT 0x1D00
 #define GL_SMOOTH 0x1D01
+#define GL_AMBIENT 0x1200
+#define GL_DIFFUSE 0x1201
+#define GL_SPECULAR 0x1202
+#define GL_EMISSION 0x1600
+#define GL_SHININESS 0x1601
+#define GL_AMBIENT_AND_DIFFUSE 0x1602
+#define GL_COLOR_INDEXES 0x1603
 
 // More blend factors
 #define GL_CONSTANT_COLOR 0x8001
@@ -452,6 +459,8 @@ GLAPI void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum
 GLAPI void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
 GLAPI void glNormal3fv(GLfloat const* v);
 GLAPI void glRasterPos2i(GLint x, GLint y);
+GLAPI void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+GLAPI void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params);
 
 #ifdef __cplusplus
 }

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

@@ -95,6 +95,7 @@ public:
     virtual void gl_stencil_op_separate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) = 0;
     virtual void gl_normal(GLfloat nx, GLfloat ny, GLfloat nz) = 0;
     virtual void gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0;
+    virtual void gl_materialv(GLenum face, GLenum pname, GLfloat const* params) = 0;
 
     virtual void present() = 0;
 };

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

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021, Stephan Unverwerth <s.unverwerth@serenityos.org>
+ * Copyright (c) 2021, Jelle Raaijmakers <jelle@gmta.nl>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
@@ -22,6 +23,17 @@ void glLightfv(GLenum light, GLenum pname, GLfloat* param)
     dbgln_if(GL_DEBUG, "glLightfv({}, {}, {}): unimplemented", light, pname, param);
 }
 
+void glMaterialf(GLenum face, GLenum pname, GLfloat param)
+{
+    VERIFY(face == GL_SHININESS);
+    g_gl_context->gl_materialv(face, pname, &param);
+}
+
+void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params)
+{
+    g_gl_context->gl_materialv(face, pname, params);
+}
+
 void glShadeModel(GLenum mode)
 {
     g_gl_context->gl_shade_model(mode);

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

@@ -2257,6 +2257,47 @@ void SoftwareGLContext::gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w
     m_current_raster_position.clip_coordinate_value = w;
 }
 
+void SoftwareGLContext::gl_materialv(GLenum face, GLenum pname, GLfloat const* params)
+{
+    APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_materialv, face, pname, params);
+
+    RETURN_WITH_ERROR_IF(!(face == GL_FRONT || face == GL_BACK || face == GL_FRONT_AND_BACK), GL_INVALID_ENUM);
+
+    RETURN_WITH_ERROR_IF(!(pname == GL_AMBIENT
+                             || pname == GL_DIFFUSE
+                             || pname == GL_SPECULAR
+                             || pname == GL_EMISSION
+                             || pname == GL_SHININESS
+                             || pname == GL_AMBIENT_AND_DIFFUSE
+                             || pname == GL_COLOR_INDEXES),
+        GL_INVALID_ENUM);
+
+    GLfloat x, y, z, w;
+
+    switch (pname) {
+    case GL_SHININESS:
+        x = params[0];
+        y = 0.0f;
+        z = 0.0f;
+        w = 0.0f;
+        break;
+    case GL_COLOR_INDEXES:
+        x = params[0];
+        y = params[1];
+        z = params[2];
+        w = 0.0f;
+        break;
+    default:
+        x = params[0];
+        y = params[1];
+        z = params[2];
+        w = params[3];
+    }
+
+    // FIXME: implement this method
+    dbgln_if(GL_DEBUG, "SoftwareGLContext FIXME: gl_materialv({}, {}, {}, {}, {}, {})", face, pname, x, y, z, w);
+}
+
 void SoftwareGLContext::present()
 {
     m_rasterizer.blit_to(*m_frontbuffer);

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

@@ -106,6 +106,7 @@ public:
     virtual void gl_stencil_op_separate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) override;
     virtual void gl_normal(GLfloat nx, GLfloat ny, GLfloat nz) override;
     virtual void gl_raster_pos(GLfloat x, GLfloat y, GLfloat z, GLfloat w) override;
+    virtual void gl_materialv(GLenum face, GLenum pname, GLfloat const* params) override;
     virtual void present() override;
 
 private:
@@ -271,7 +272,8 @@ private:
             decltype(&SoftwareGLContext::gl_stencil_func_separate),
             decltype(&SoftwareGLContext::gl_stencil_op_separate),
             decltype(&SoftwareGLContext::gl_normal),
-            decltype(&SoftwareGLContext::gl_raster_pos)>;
+            decltype(&SoftwareGLContext::gl_raster_pos),
+            decltype(&SoftwareGLContext::gl_materialv)>;
 
         using ExtraSavedArguments = Variant<
             FloatMatrix4x4>;