1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:27:43 +00:00

LibGL: Implement glMateriali{v}

This commit is contained in:
Jesse Buhagiar 2022-01-24 18:20:46 +11:00 committed by Andreas Kling
parent 170739fe39
commit 371d49c0f6
5 changed files with 62 additions and 0 deletions

View file

@ -631,6 +631,8 @@ GLAPI void glNormalPointer(GLenum type, GLsizei stride, void const* pointer);
GLAPI void glRasterPos2i(GLint x, GLint y); GLAPI void glRasterPos2i(GLint x, GLint y);
GLAPI void glMaterialf(GLenum face, GLenum pname, GLfloat param); GLAPI void glMaterialf(GLenum face, GLenum pname, GLfloat param);
GLAPI void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params); GLAPI void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params);
GLAPI void glMateriali(GLenum face, GLenum pname, GLint param);
GLAPI void glMaterialiv(GLenum face, GLenum pname, GLint const* params);
GLAPI void glLineWidth(GLfloat width); GLAPI void glLineWidth(GLfloat width);
GLAPI void glPushAttrib(GLbitfield mask); GLAPI void glPushAttrib(GLbitfield mask);
GLAPI void glPopAttrib(); GLAPI void glPopAttrib();

View file

@ -119,6 +119,7 @@ public:
virtual void gl_lightiv(GLenum light, GLenum pname, GLint const* params) = 0; virtual void gl_lightiv(GLenum light, GLenum pname, GLint const* params) = 0;
virtual void gl_materialf(GLenum face, GLenum pname, GLfloat param) = 0; virtual void gl_materialf(GLenum face, GLenum pname, GLfloat param) = 0;
virtual void gl_materialfv(GLenum face, GLenum pname, GLfloat const* params) = 0; virtual void gl_materialfv(GLenum face, GLenum pname, GLfloat const* params) = 0;
virtual void gl_materialiv(GLenum face, GLenum pname, GLint const* params) = 0;
virtual void gl_color_material(GLenum face, GLenum mode) = 0; virtual void gl_color_material(GLenum face, GLenum mode) = 0;
virtual void gl_get_light(GLenum light, GLenum pname, void* params, GLenum type) = 0; virtual void gl_get_light(GLenum light, GLenum pname, void* params, GLenum type) = 0;
virtual void gl_get_material(GLenum face, GLenum pname, void* params, GLenum type) = 0; virtual void gl_get_material(GLenum face, GLenum pname, void* params, GLenum type) = 0;

View file

@ -81,6 +81,16 @@ void glMaterialfv(GLenum face, GLenum pname, GLfloat const* params)
g_gl_context->gl_materialfv(face, pname, params); g_gl_context->gl_materialfv(face, pname, params);
} }
void glMateriali(GLenum face, GLenum pname, GLint param)
{
g_gl_context->gl_materialf(face, pname, param);
}
void glMaterialiv(GLenum face, GLenum pname, GLint const* params)
{
g_gl_context->gl_materialiv(face, pname, params);
}
void glShadeModel(GLenum mode) void glShadeModel(GLenum mode)
{ {
g_gl_context->gl_shade_model(mode); g_gl_context->gl_shade_model(mode);

View file

@ -3549,6 +3549,53 @@ void SoftwareGLContext::gl_materialfv(GLenum face, GLenum pname, GLfloat const*
m_light_state_is_dirty = true; m_light_state_is_dirty = true;
} }
void SoftwareGLContext::gl_materialiv(GLenum face, GLenum pname, GLint const* params)
{
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_materialiv, 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), GL_INVALID_ENUM);
RETURN_WITH_ERROR_IF((pname == GL_SHININESS && *params > 128), GL_INVALID_VALUE);
auto update_material = [](SoftGPU::Material& material, GLenum pname, GLint const* params) {
switch (pname) {
case GL_AMBIENT:
material.ambient = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
break;
case GL_DIFFUSE:
material.diffuse = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
break;
case GL_SPECULAR:
material.specular = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
break;
case GL_EMISSION:
material.emissive = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
break;
case GL_SHININESS:
material.shininess = static_cast<float>(params[0]);
break;
case GL_AMBIENT_AND_DIFFUSE:
material.ambient = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
material.diffuse = { static_cast<float>(params[0]), static_cast<float>(params[1]), static_cast<float>(params[2]), static_cast<float>(params[3]) };
break;
}
};
switch (face) {
case GL_FRONT:
update_material(m_material_states[Face::Front], pname, params);
break;
case GL_BACK:
update_material(m_material_states[Face::Back], pname, params);
break;
case GL_FRONT_AND_BACK:
update_material(m_material_states[Face::Front], pname, params);
update_material(m_material_states[Face::Back], pname, params);
break;
}
m_light_state_is_dirty = true;
}
void SoftwareGLContext::gl_color_material(GLenum face, GLenum mode) void SoftwareGLContext::gl_color_material(GLenum face, GLenum mode)
{ {
APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_color_material, face, mode); APPEND_TO_CALL_LIST_AND_RETURN_IF_NEEDED(gl_color_material, face, mode);

View file

@ -150,6 +150,7 @@ public:
virtual void gl_lightiv(GLenum light, GLenum pname, GLint const* params) override; virtual void gl_lightiv(GLenum light, GLenum pname, GLint const* params) override;
virtual void gl_materialf(GLenum face, GLenum pname, GLfloat param) override; virtual void gl_materialf(GLenum face, GLenum pname, GLfloat param) override;
virtual void gl_materialfv(GLenum face, GLenum pname, GLfloat const* params) override; virtual void gl_materialfv(GLenum face, GLenum pname, GLfloat const* params) override;
virtual void gl_materialiv(GLenum face, GLenum pname, GLint const* params) override;
virtual void gl_color_material(GLenum face, GLenum mode) override; virtual void gl_color_material(GLenum face, GLenum mode) override;
virtual void gl_get_light(GLenum light, GLenum pname, void* params, GLenum type) override; virtual void gl_get_light(GLenum light, GLenum pname, void* params, GLenum type) override;
virtual void gl_get_material(GLenum face, GLenum pname, void* params, GLenum type) override; virtual void gl_get_material(GLenum face, GLenum pname, void* params, GLenum type) override;
@ -378,6 +379,7 @@ private:
decltype(&SoftwareGLContext::gl_lightiv), decltype(&SoftwareGLContext::gl_lightiv),
decltype(&SoftwareGLContext::gl_materialf), decltype(&SoftwareGLContext::gl_materialf),
decltype(&SoftwareGLContext::gl_materialfv), decltype(&SoftwareGLContext::gl_materialfv),
decltype(&SoftwareGLContext::gl_materialiv),
decltype(&SoftwareGLContext::gl_color_material), decltype(&SoftwareGLContext::gl_color_material),
decltype(&SoftwareGLContext::gl_get_light)>; decltype(&SoftwareGLContext::gl_get_light)>;